指针变量可以指向任何类型的数据,也可以指向一个函数。每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向这个函数入口地址的指针称为函数指针。
int max(int a, int b) { return a > b ? a : b; } int (*p) (int , int) = max; int x = 20, y = 30; int z = p(x, y);
首先定义了一个max函数,函数接受两个int类型的参数并返回其中的最大值。
int (*p) (int , int) = max;
这行代码中定义了一个函数指针p,在定义函数指针时必须指明函数指针所指向函数的返回值和参数列表。代码中的函数指针p所指向的函数的返回值为int类型,参数列表为两个int类型的参数,这与max函数的返回值和参数列表一致,因此可以用函数max初始化函数指针p。
注:函数名等价于函数的入口地址
在定义时 * p 必须用括号括起来,如果去掉括号代码变为
int *p (int, int) // p 是函数而非指针
上面代码中的p不是一个函数指针,而是一个函数名。代码声明了一个函数p,函数返回值类型为int* 类型,并且包括两个int类型的参数。
代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> int add(int a, int b) { return a + b; } int minus(int a, int b) { return a - b; } int multi(int a, int b) { return a * b; } int divide(int a, int b) { return a / b; } int calculator(int a, int b, int(*Func)(int, int)) { return Func(a, b); } int main() { int a = 40, b = 20; int res1 = calculator(a, b, add); printf("a + b = %d ", res1); int res2 = calculator(a, b, minus); printf("a - b = %d ", res2); int res3 = calculator(a, b, multi); printf("a * b = %d ", res3); int res4 = calculator(a, b, divide); printf("a / b = %d ", res4); system("pause"); return 0; }
运行结果:
使用typedef关键字对函数指针类型重定义,并在定义函数指针时使用通过typedef重定义后的类型名。
typedef int (*pFunc) (int, int); int calculator( int a, int b, pFunc func );