-
函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下:
data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn);
eg:int add(int nLeft,int nRight);//函数定义
- 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可:
int (*pf)(int,int);//未初始化 //这里就定义了一个指向某函数(这个函数参数仅仅为两个 int 类型,函数返回值是 int 类型)的指针 fp。
则pf可指向int(int,int)类型的函数。pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则pf可指向int(int,int)类型的函数。而add类型为int(int,int),则pf可指向add函数。
pf = add;//通过赋值使得函数指针指向某具体函数
注意:*pf两端的括号必不可少,否则若为如下定义:
int *pf(int,int);//此时pf是一个返回值为int*的函数,而非函数指针
typedef 定义可以简化函数指针的定义
int test(int a)
{
return a;
}
int main(int argc, const char * argv[])
{
typedef int (*fp)(int a);
fp f = test;
cout<<f(2)<<endl;
return 0;
}
- 函数指针同样是可以作为参数传递给函数的
int test(int a)
{
return a-1;
}
int test2(int (*fun)(int),int b)
{
int c = fun(10)+b;
return c;
}
int main(int argc, const char * argv[])
{
typedef int (*fp)(int a);
fp f = test; cout<<test2(f, 1)<<endl;
// 调用 test2 的时候,把test函数的地址作为参数传递给了 test2
return 0;
}
执行以上代码,输出结果为:
10
- 利用函数指针,我们可以构成函数指针数组,更明确点的说法是构成指向函数的指针数组。
void t1() { cout << "test1" << endl; } void t2() { cout << "test2" << endl; } void t3() { cout << "test3" << endl; } int main(int argc, const char * argv[]) { typedef void(*fp)(void); fp b[] = { t1,t2,t3 }; // b[] 为一个指向函数的指针数组 b[0](); // 利用指向函数的指针数组进行下标操作就可以进行函数的间接调用了 return 0; }
-
extern 存储类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
-
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。
这个功能主要用在下面的情况:
1、C++代码调用C语言代码
2、在C++的头文件中使用
3、在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到
-