首先认识什么是函数指针数组
指针:每个变量一创建就会有一个地址,函数创建是也有地址,而保存地址的类型就是指针变量类型。
函数指针:指针指向的地址是整型的就是整型指针,指向浮点型的就是浮点型指针,那么指向函数的就是函数指针。
int Add(int x, int y){
return x + y;
}//这是函数
int* a;//这是整型指针,int*为整型指针类型,a为整型指针名字
char* b;//这是字符型指针,char*为字符指针类型,a为字符指针名字
double* c;//这是浮点型指针,double*为浮点型指针类型,a为浮点型指针名字
//int (*) (int,int)是函数指针类型,pf为函数指针名字,
//前面的int是函数的Add函数的返回类型,后面两个int是函数的参数
int (*pf)(int,int) = Add;//这是函数指针
指针数组:显而易见,什么类型的数组也是由前面的类型决定的,指针数组就是元素全是指针的数组。
int arr[]={0};//这是整形数组,数组里的元素都是整型
char arr[]={0};//这是字符串数组,数组里的元素都是字符
double arr[]={0};//这是浮点型数组,数组里的元素都是浮点数
int* arr[];//这是指针数组,数组里的元素都是指针
函数指针数组就是建一个数组,这个数组的所有元素都是函数指针。
需要用到的函数
菜单
void menu() {
printf("*******************************\n");
printf("*******1.Add 2.Sub*************\n");
printf("*******3.Mul 4.Div*************\n");
printf("***********0.exit**************\n");
printf("*******************************\n");
}
这是加减乘除四个函数
//加
int Add(int x, int y) {
printf("加法操作\n");
return x + y;
}
//减
int Sub(int x, int y) {
printf("减法操作\n");
return x - y;
}
//乘
int Mul(int x, int y) {
printf("乘法操作\n");
return x * y;
}
//除
int Div(int x, int y) {
printf("除以操作\n");
return x / y;
}
函数指针数组实现计算器
main函数
int main() {
int input;
int x, y;
int ret;
//这是函数指针数组,元素是加减乘除四个函数的地址,为了能够对应下面的input,0下标写个NULL
int (*cal[])(int, int) = { NULL, Add, Sub, Mul, Div };
do {
menu();
scanf("%d", &input);
printf("请输入两个数\n");
scanf("%d %d", &x, &y);
switch (input)
{
case 0:
break;
//input输入哪个值,就会实现对应函数的功能
case 1:
ret = cal[input](x, y);
printf("加法操作,得数为:%d\n", ret);
break;
case 2:
ret = cal[input](x, y);
printf("减法操作,得数为:%d\n", ret);
break;
case 3:
ret = cal[input](x, y);
printf("乘法操作,得数为:%d\n", ret);
break;
case 4:
ret = cal[input](x, y);
printf("除法操作,得数为:%d\n", ret);
break;
default:
printf("无此操作,请重新输入\n");
break;
}
} while (input);
return 0;
}
但用函数指针数组有一个缺陷,就是在switch语句中有许多相似的代码,代码重复冗余,十分影响观感。现在函数只有四个,如果以后有十多二十多个函数,那代码量就大了,所以我们需要回调函数。
什么是回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
回调函数实现计算器
//为防止代码冗余,写一个回调函数
//回调函数,参数是函数指针
void Cal(int(*pf)(int, int)) {
int x, y;
int ret;
printf("请输入两个数\n");
scanf("%d,%d", &x, &y);
ret = pf(x, y);
printf("ret = %d\n",ret);
}
//利用回调函数来实现简单的整数计算功能
int main() {
int input;
do {
menu();
scanf("%d", &input);
int ret;
switch (input)
{
case 0:
printf("退出");
break;
case 1:
//写一个函数,参数为函数指针,把要用的函数作为参数转过去,回调函数会根据参数实现不同的功能
//回调函数相当于中转站
Cal(Add);
break;
case 2:
Cal(Sub);
break;
case 3:
Cal(Mul);
break;
case 4:
Cal(Div);
break;
default:
printf("无此操作,请重新输入\n");
break;
}
} while (input);
return 0;
}