【C++深入浅出】一文搞懂什么是 函数指针

写在前面:我写博客主要是为了对知识点的总结、回顾和思考,把每篇博客写得通俗易懂 是我的目标,因为能让别人看懂,才是真的学会了

从Math到CS的跨专业经历,让我格外珍惜学习时间,更加虚心好学,而分享技术和知识是快乐 的,非常欢迎大家和我一起交流学习,期待与您的进一步交流

一、函数的地址

函数跟变量一样也有自己的地址,并且函数的地址就是函数名

int t;
// 变量t的地址是:&t
void function(int a) {
	cout << a << endl;
}
// 上面这个函数的地址是:function

二、定义函数指针

声明函数指针是必须指定函数的返回值类型参数类型
表明这个指针,只能指向这种形式的函数

例如:

定义一个函数

void add(int a, int b) {
	cout << a + b << endl;
}

然后我们定义一个函数指针pa,具体语法如下

// 定义函数指针pa
void (*pa)(int, int);

pa只能指向形如返回值是void,参数是两个int的函数

三、 使用函数指针

注意:传递实参的时候是直接传递函数指针(地址)或函数名(地址),不用传递函数内的参数

例如:f(3, 1, pa);f(3, 1, add);

可以这样认为

  • 函数名add是一个函数指针常量
  • 定义的函数指针pa是一个函数指针变量

具体实例代码

#include <iostream>

using namespace std;

void add(int a, int b) {
    cout << a + b << endl;
}

void sub(int x, int y) {
    cout << x - y << endl;
}

int plus(int m, int n) {
    return m + n;
}

// 参数表中:声明一个函数指针pa,接受地址(函数名)参数
void f(int i, int j, void(*pa)(int, int)) { 
    // 如果pa = add,那么说明函数指针pa指向add函数
    // 如果pa = sub,那么说明函数指针pa指向sub函数
    
    // *pa相当于调用这个函数,并传入参数i,j
    (*pa)(i, j); 
    // pa(i, j); C++允许直接写pa来调用函数,但本质(*pa)
}

int main() {
    void (*pa)(int, int); // 定义函数指针pa
    pa = add; // add是函数名所以是地址,而指针本质就是地址
    
    f(3, 1, pa);
    // 输出4
    
    pa = sub;
    f(3, 1, pa);
    // 输出2

 	// pa = plus; ERROR 因为pa不能指向返回值是int的函数
    return 0;
}

再强调一下:

在使用函数指针时C++允许直接写pa来调用函数,但本质(*pa),所以下面两行代码是等价的

(*pa)(i, j); 
pa(i, j); // 本质是(*pa)(i, j);

建议写(*pa)(i, j);因为这样表明我用的是函数指针,而不是普通的函数用法

阅读更多文章,请看【我的博客汇总】

发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104240355