函数指针数组的概念
数组是⼀个存放相同类型数据的存储空间,我们已经学习了指针数组, ⽐如:
数组的每个元素是int*类型。
而函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的,比如:
那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?如图:
即在函数指针的基础上加上[],[]中为元素个数。
parr1 先和 [] 结合,说明 parr1是数组,数组的内容是 int (*)(int x, int y) 类型的函数指针。
函数指针数组实现转移表
接下来我们来实现一个计算器,之后通过函数指针数组进行改进。
计算器的一般实现:
//加法
int Add(int a, int b)
{
return a + b;
}
//减法
int Sub(int a, int b)
{
return a - b;
}
//乘法
int Mul(int a, int b)
{
return a * b;
}
//除法
int Div(int a, int b)
{
return a / b;
}
//菜单
void menu()
{
printf("*************************\n");
printf("****** 1.Add 2.Sub ******\n");
printf("****** 3.Mul 4.Div ******\n");
printf("******** 0.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("ret = %d\n", ret);
break;
case 2:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
从上面的代码我们可以看到,在switch语句中,除了各自使用的函数不同,其他的语句均相同,这就出现了冗余现象。
那要怎么解决呢?
接下来我们使用函数指针数组对代码进行改进:
如图,我们可以定义一个函数指针数组,将计算器中函数的地址放进数组中,当需要用到函数时,直接通过函数指针数组进行调用,这样就可以很好解决代码冗余问题。当然,为了方便数组中函数与用户选择使用的函数一致,下标为0的元素可以用0数字替代。
转移表的最终实现:
//加法
int Add(int a, int b)
{
return a + b;
}
//减法
int Sub(int a, int b)
{
return a - b;
}
//乘法
int Mul(int a, int b)
{
return a * b;
}
//除法
int Div(int a, int b)
{
return a / b;
}
//菜单
void menu()
{
printf("*************************\n");
printf("****** 1.Add 2.Sub ******\n");
printf("****** 3.Mul 4.Div ******\n");
printf("******** 0.exit *********\n");
printf("*************************\n");
}
//函数指针数组
int (*p[])(int x, int y) = { 0, Add, Sub, Mul, Div };
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = p[input](x, y);
printf("ret = %d\n", ret);
}
else if (input == 0)
{
printf("退出程序\n");
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}
注:在使用转移表的过程中,可以往函数指针数组添加其他函数,只要参数类型以及返回值类型相同即可。
标签:return,int,ret,数组,printf,函数指针,转移 From: https://blog.csdn.net/weixin_71853810/article/details/141126730