C 语言 - 函数指针
函数指针是指向函数的指针变量
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数
函数指针可以像一般函数一样,用于调用函数、传递参数
声明一个函数指针
函数指针变量的声明语法如下
typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型
范例
下面的代码声明了一个函数置身变量 p, 并将它指向函数 max()
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> int max(int x, int y) { return x > y ? x : y; } int main(void) { /* p 是函数指针 */ int (* p)(int, int) = & max; // &可以省略 int a, b, c, d; printf("请输入三个数字:"); scanf("%d %d %d", & a, & b, & c); /* 与直接调用函数等价,d = max(max(a, b), c) */ d = p(p(a, b), c); printf("最大的数字是: %d\n", d); return 0; }
编译运行以上 C 语言代码,输出结果如下
$ gcc main.c && a.out 请输入三个数字:8 10 12 最大的数字是: 12
typedef 定义指针类型
C 语言可以使用 typedef
将函数指针定义为一个类型
例如我们可以定义一个接受两个 int
型的参数,然后返回一个 int
型的的函数类型
typedef int (*func)(int, int);
看起来是不是和定义一个 函数指针 类似,这样,我们就可以用这个函数类型声明一个函数指针变量了
func p = max;
我们用一段代码来演示下
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> typedef int (*func)(int x, int y); int max(int x, int y) { return x > y ? x : y; } int main(void) { /* p 是函数类型 func 的变量 */ func p = max; int a, b, c, d; printf("请输入三个数字:"); scanf("%d %d %d", & a, & b, & c); /* 与直接调用函数等价,d = max(max(a, b), c) */ d = p(p(a, b), c); printf("最大的数字是: %d\n", d); return 0; }
编译运行以上 C 语言代码,输出结果如下
$ gcc main.c && a.out 请输入三个数字:8 10 12 最大的数字是: 12
函数参数
既然可以定义函数指针类型,那么就可以将函数指针作为参数传递给另一个函数了
例如下面的代码
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> typedef int (*func)(int, int); int max(int x, int y) { return x > y ? x : y; } int handle_it (int x, int y, func p) { int z = p(x,y); return z; } int main(void) { int a, b, c; printf("请输入两个数字:"); scanf("%d %d", & a, & b); c = handle_it(a, b, max); printf("最大的数字是: %d\n", c); return 0; }
编译运行以上 C 语言代码,输出结果如下
$ gcc main.c && a.out 请输入三个数字:10 12 最大的数字是: 12
回调函数
经过前面章节的学习,我们知道,任何函数都有返回值,哪怕没有显式的 return
语句
如果一个函数接受函数指针作为参数,最后返回的结果是调用指针的结果,那么我们就称这个函数指针为回调函数
其实上面的范例中 max()
函数就是函数 handle_it()
的回调函数了,不过我们可以写的更清楚明白些
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> typedef int (*func)(int, int); int max(int x, int y) { return x > y ? x : y; } int handle_it (int x, int y, func p) { return p(x,y); } int main(void) { int a, b, c; printf("请输入两个数字:"); scanf("%d %d", & a, & b); c = handle_it(a, b, max); printf("最大的数字是: %d\n", c); return 0; }
编译运行以上 C 语言代码,输出结果如下
$ gcc main.c && a.out 请输入三个数字:10 12 最大的数字是: 12