文章目录

  • 8.指向函数指针数组的指针
  • 9.回调函数

8.指向函数指针数组的指针

请看代码与注释

int Add(int x, int y){return x + y;}int Sub(int x, int y){return x - y;}int main(){int (*pf)(int, int) = Add;//函数指针数组int (*pfArr[4])(int, int) = { Add,Sub };int (*(*ppfArr)[4])(int, int) = &pfArr;//ppfArr 是一个指向函数数组的指针return 0;}

9.回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

举个例子

还是一个简易计算器

int Add(int x, int y){return x + y;}int Sub(int x, int y){return x - y;}int Mul(int x, int y){return x * y;}int Div(int x, int y){return x / y;}void menu(){printf("****************************************\n");printf("******    1.add        2.sub     *******\n");printf("******    3.mul        4.div     *******\n");printf("******          5.exit           *******\n");printf("****************************************\n");}int main(){int input = 0;int x = 0;int y = 0;int ret = 0; do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = Add(x, y);printf("%d\n", ret);break;case 2:printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("%d\n", ret);break;case 3:printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("%d\n", ret);break;case 4:printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = Div(x, y);printf("%d\n", ret);break;case 0:printf("退出计算器\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

☝️虽然可以很好的运行出来,但是看一下这段代码是不是有些冗余

大部分代码都是重复的,只有调用执行 + – * / 运算的时候不一样,那么我们可不可以把这每段重复的部分封装成一个函数呢❓

我们来进行优化改装一下

void Calc(int(*pf)(int, int)){int x = 0;int y = 0;int ret = 0;printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);}

我们把每次输入输出 执行运算封装成这样的一个函数,只保留一个,使用函数指针来接收
优化后的源码

#includeint Add(int x, int y){return x + y;}int Sub(int x, int y){return x - y;}int Mul(int x, int y){return x * y;}int Div(int x, int y){return x / y;}void menu(){printf("****************************************\n");printf("******    1.add        2.sub     *******\n");printf("******    3.mul        4.div     *******\n");printf("******          5.exit           *******\n");printf("****************************************\n");}void Calc(int(*pf)(int, int)){int x = 0;int y = 0;int ret = 0;printf("请输入两个操作数:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);}int main(){int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:Calc(Add);break;case 2:Calc(Sub);break;case 3:Calc(Mul);break;case 4:Calc(Div);break;case 0:printf("退出计算器\n");break;default:printf("选择错误\n");break;}} while (input);return 0;}

可能有那么一点点复杂,希望烙铁们能够理解‼️

总结
以上就是 指针的进阶【下篇】 内容啦
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦
希望我们可以做一个用心的人
小的会继续学习,继续努力带来更好的作品
创作写文不易,还多请各位大佬uu们多多支持哦