一、函数指针
1.1、概念定义
函数指针是指向函数的指针变量。 因此函数指针本质上是一个指针变量,只不过该指针变量指向函数。指针变量也可以指向整型变量、字符型、数组,也可以指向函数。C语言中,每一个函数都有一个入口地址,函数指针就指向函数的入口地址,可以通过函数指针来调用函数。例如:
int func(int x, int y) {
cout << x << ":" << y << endl;
return 0;
}
int main() {
// pfnFunc保存的就是func函数地址,pfnFunc与func值是一样的
int (*pfnFunc)(int x,int y) = func;
printf("%p\n", pfnFunc);
printf("%p\n", func);
return 0;
}
输出结果
00401350
00401350
Process returned 0 (0x0) execution time : 0.069 s
Press any key to continue.
1.2、函数指针声明
函数指针的声明方法为:返回值类型 ( * 指针变量名) ([形参列表])。常用的声明函数指针的方式有下面两种
// 方法一:声明一种函数指针类型(该方法比较常用)
typedef int (*TEST_FUNC)(int, int);
int func(int x, int y) {
cout << x << ":" << y << endl;
return 0;
}
int main() {
TEST_FUNC cb = func;
(cb)(10, 20);
// 方法二:定义一个函数指针变量
int (*pfnFunc)(int x,int y) = func;
// 通过指针调用函数
pfnFunc(10, 20);
(*pfnFunc)(10, 20);
return 0;
}
注意:通过函数指针调用函数时,(*pfnFunc)与pfnFunc等价。
1.3、获取函数地址
C语言中没有类的概念,只有普通的函数,通过函数名就可以得到函数地址,如下:
void func(int a)
{
cout << a << endl;
}
int main()
{
printf("%p\n", func);
printf("%p\n", &func);
return 0;
}
输出结果
00401350
00401350
Process returned 0 (0x0) execution time : 0.007 s
Press any key to continue.
对于 func 和 &func 应该这样理解:
- func 是函数的首地址,它的类型是 void ()
- &func 表示一个指向函数 func 这个对象的地址,它的类型是 void (*)(int)
因此,从前面的输出结果可以看出来,func和&func所代表的地址值是一样的,但类型不一样。