第一次听说函数指针的话肯定会有这样的疑问,函数是否有地址?其实是有的。
在内存中有一部分是专门用来存放代码的代码区,所谓函数就是由一些运行的语句组成的,函数的内存就属于这一区域。但是函数中用的变量并不在改区域,两者在地址上差距很大。
下面通过一段代码来演示:
#include函数指针 函数指针定义using namespace std; int add(int* a, int* b) { //打印变量地址 printf("a: %p, b: %pn", &a, &b); return *a + *b; } int main() { int a = 1, b = 2; add(&a, &b); //打印函数地址,不要用cout<<&add,因为重载输出结果不是地址而是个布尔值 printf("func address: %pn", &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兼容了两种方式



