C/C++函数指针
函数是否有地址
第一次听说函数指针的话肯定会有这样的疑问,函数是否有地址?其实是有的。
在内存中有一部分是专门用来存放代码的代码区,所谓函数就是由一些运行的语句组成的,函数的内存就属于这一区域。但是函数中用的变量并不在改区域,两者在地址上差距很大。
下面通过一段代码来演示:
#include <iostream>
using namespace std;
int add(int* a, int* b)
{
//打印变量地址
printf("a: %p, b: %p\n", &a, &b);
return *a + *b;
}
int main()
{
int a = 1, b = 2;
add(&a, &b);
//打印函数地址,不要用cout<<&add,因为重载输出结果不是地址而是个布尔值
printf("func address: %p\n", &add);
return 0;
}
函数指针
函数指针定义
我们仍以上文的add函数为例,定义一个名为fp指向add函数的指针
int (*fp)(int* a, int* b) = &add;
很显然,函数指针定义就是把函数声明中的函数名替换成了(*函数指针名)
函数指针调用
函数指针调用有两种形式,我们通过刚才写的fp来调用函数add,并传入两个参数——a和b的地址(其中a=1,b=2)
(*fp)(&a, &b); //方式一,解引调用
fp(&a, &b); //方式二,直接调用
有趣的是,这两种方式的存在是有历史原因的:
- 贝尔实验室的C和Unix开发者采用第一种方式
- 伯利克和Unix推广者采用第二种方式
- 最后ANSI C兼容了两种方式