写在前面:我写博客主要是为了对知识点的总结、回顾和思考,把每篇博客写得通俗易懂 是我的目标,因为能让别人看懂,才是真的学会了
从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);
因为这样表明我用的是函数指针,而不是普通的函数用法
阅读更多文章,请看【我的博客汇总】