什么是回调函数
函数名可以用来作为参数的函数称为回调函数。
回调函数作用
- 可以子啊恰当时候发送通知指令
- 使代码更加的灵活
- 可以提高代码的效率
C语言函数指针如何定义
int (*pfunc)(int, int); //声明函数的函数指针
上面是下面函数的函数指针,两者的函数返回值指类型相同,函数的形参类型和数目相同,函数名的部分是有小括号括起来,加上*号。最后写上函数指针名字,函数指针名字最为标识符,你愿意写什么样的都可以,就相当于一个变量,自己命名就好
int Add(int a, int b) { return a + b; }
函数指针的应用场景
第一种情况:
首先定义一个函数
int Add(int a, int b) { return a + b; }
其次,编写一个函数,里面声明一个函数指针,使用函数指针调用函数
void TestHDFunOne() {
int a = 1;
int b = 9;
int sum = Add(a, b);
printf("sum = %d\n", sum);
int (*pfunc)(int, int); //声明函数的函数指针
pfunc = Add; //对函数指针赋值,函数指针 = 函数名;
int sum1 = pfunc(a, b); //函数指针名调用函数,C++
printf("sum1 = %d\n", sum1);
int sum2 = (*pfunc)(a, b); //函数指针名调用函数,C
printf("sum2 = %d\n", sum2);
}
最后,在main 函数调用函数TestHDFunOne()
int main() {
printf("start\r\n");
TestHDFunOne();
return 0;
}
结果:
第二种情况:无返回值回调函数
首先
定义两个没有返回值,没有形参的函数
void ChiZaoFan() { printf("吃早饭\n"); }
void ChiWanFan() { printf("吃晚饭\n"); }
其次,定义回调函数
回调函数吴返回值,形参是上面定义的无返回值、无形参的函数的函数指针
void TestHDFunTow(void (*fp)()) {
printf("开始\n");
(*fp)();//函数的具体调用语句
printf("结束\n");
}
最后,在主函数调用回调函数
int main() {
printf("start\r\n");
TestHDFunTow(ChiZaoFan);
TestHDFunTow(ChiWanFan);
return 0;
}
结果:
第三种情况:回调函数调用有形参的函数
首先:定义两个有形参的函数
void ChiZaoFanFood(int food) { printf("吃早饭:%d\n", food); }
void ChiWanFanFood(int food) { printf("吃晚饭:%d\n", food); }
其次, 定义回调函数,这使用的是在回调函数的内部传递实参
void TestHDFunThree(void (*fp)(int)) {
printf("开始\n");
int c = 1; //函数内部将实传入
(*fp)(c);
printf("结束\n");
}
主函数
int main() {
printf("server start\r\n");
NetClientInit(NetClintRecv);
TestHDFunThree(ChiZaoFanFood);
TestHDFunThree(ChiWanFanFood);
return 0;
}
第四种情况:回调函数调用有形参的函数,有外部传入参数
首先,定义函数
void ChiZaoFanFood(int food) { printf("吃早饭:%d\n", food); }
void ChiWanFanFood(int food) { printf("吃晚饭:%d\n", food); }
其次,定义回调函数,注意,这里的回调函数的形参多了一个
void TestHDFunFour(void (*fp)(int), int c) {
printf("开始\n");
(*fp)(c);
printf("结束\n");
}
主函数
int main() {
printf("server start\r\n");
TestHDFunFour(ChiZaoFanFood, 2);
TestHDFunFour(ChiWanFanFood, 3);
return 0;
}
结果:
从外传入实参的回调函数就比从里面传入的更加可以灵活使用