一、函数的地址
在一个程序中,不仅仅是变量需要分配内存,函数也一样,那么函数自然也可以有指针,是函数的入口地址。
函数的地址就是函数名。
// 变量t的地址是:&t
int t;
// 这个函数的地址是它的函数名,也就是 function
void function(int a) {
cout << a << endl;
}
二、定义函数指针
声明函数指针是必须指定函数的返回值类型与参数类型。表明这个指针,只能指向这种形式的函数。
void add(int a, int b) {
cout << a + b << endl;
}
函数指针声明只比函数声明多一个 *
和一对括号,例如:
void (*pa)(int, int);
其中把 *pa
括起来的括号一定不能少。
三、使用函数指针
注意:传递实参的时候是直接传递函数指针(地址)或函数名(地址),不用传递函数内的参数。
例如: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);
,因为这样表明我用的是函数指针,而不是普通的函数用法。