📀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); }
💡 我们把每次输入输出 执行运算封装成这样的一个函数,只保留一个,使用函数指针来接收
💡 优化后的源码👇
#include<stdio.h> 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"); } 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; }