回调函数
函数指针一个非常重要的作用就是回调函数,回调函数是通过函数指针 调用的函数。如果把函数指针(函数的地址)作为参数传递 给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。回调函数不是由该函数的调用者直接调用,而是在特定的事件或条件发生时由另外一方调用,用于对该事件或条件进行响应。
回调函数的使用示例代码如下:
void func(int (*p)(int,int),int b,int c);
上述代码中,func()函数的第一个参数p是一个函数指针,它作为函数func()的参数使用,在func()函数内部可以回调p指向的函数。
回调函数在大型的工程和一些系统框架中很常见,如在服务器领域使用的Reactor架构、MFC编程中使用“句柄”等都是回调函数的应用。回调函数存在的意义是在特定条件发生时,调用方对该条件的即时响应处理。
下面通过一个案例演示回调函数的使用,具体如例1所示。
例1 callback.c
1 #include <stdio.h>
2 int plus(int a, int b) //定义相加函数
3 {
4 return a + b;
5 }
6 int minus(int a, int b) //定义相减函数
7 {
8 return a - b;
9 }
10 int times(int a, int b) //定义相乘函数
11 {
12 return a * b;
13 }
14 // 定义函数,通过函数指针参数调用函数(回调)
15 int func(int(*p)(int, int), int b, int n)
16 {
17 int result = 0;
18 for (int i = 0; i < n; i++)
19 {
20 result += p (i, b); //回调函数指针p指向的函数
21 }
22 return result;
23 }
24 int main()
25 {
26 int result;
27 //定义指向plus()、minus()、times()函数的函数指针
28 int (*pplus)(int, int) = plus;
29 int (*pminus)(int, int) = minus;
30 int (*ptimes)(int, int) = times;
31 //调用func()函数,分别传入不同的函数指针,回调不同的函数
32 result = func(pplus, 1, 10); //回调plus()函数
33 printf("1+2+3+...+10 = %d\n", result);
34 result = func(pminus, 10, 10); //回调minus()函数
35 printf("-10-9-8-...-1 = %d\n", result);
36 result = func(ptimes, 2, 6); //回调times()函数
37 printf("0+2+4+...+10 = %d\n", result);
38 return 0;
39 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~13行代码分别定义了plus()、minus()、times()函数,实现两个整数的加减乘运算;第15~23行代码定义了一个func()函数,该函数接受一个函数指针和两个整型数据作为参数,在函数内部,通过for循环获取数据,将获取的数据传递给函数指针p作为参数,实现相应运算,这个过程就是回调p指向的函数。在main()函数中,第28~30行代码分别定义了指向plus()函数、minus()函数、times()函数的指针;第32~33行代码,调用func()函数,传入pplus函数指针,在func()内部回调plus()函数实现1~10之间的自然数相加;第34~35行代码,调用func()函数,传入pminus函数指针,在func()函数内部回调minus()函数实现(-10)~(-1)之间的整数相加;第36~37行代码,调用func()函数,传入ptimes函数指针,在函数内部回调times()函数,实现0~10之间的偶数相加。
由图1可知,三次func()函数调用均成功,这表明func()函数内部的回调函数也调用成功。