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兼容了两种方式
最后修改:2022 年 08 月 05 日
如果觉得我的文章对你有用,请随意赞赏