函数指针数组
![](https://i-blog.csdnimg.cn/blog_migrate/30b8bcd5fb3b0db03076f6df341a6a93.png)
#include<stdio.h>
计算器所包含的功能
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("*****0.exit ***** 1.Add******\n");
printf("*****2.Sub ***** 3.Mul******\n");
printf("********* 4.Div **********\n");
printf("*********************************\n");
}
//计算器的实现
int main()//主函数
{
int input = 0;
do
{
int a = 0;
int b = 0;
menu();
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case 1:
{
printf("请输入两个操作数:");
scanf("%d %d", &a, &b);
int c = Add(a, b);
printf("%d\n", c);
break;
}
case 2:
{
printf("请输入两个操作数:");
scanf("%d %d", &a, &b);
int c = Sub(a, b);
printf("%d\n", c);
break;
}
case 3:
{
printf("请输入两个操作数:");
scanf("%d %d", &a, &b);
int c = Mul(a, b);
printf("%d\n", c);
break;
}
case 4:
{
printf("请输入两个操作数:");
scanf("%d %d", &a, &b);
int c = Div(a, b);
printf("%d\n", c);
break;
}
case 0:
printf("已退出\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
***************************************************
我们可以发现加减乘除其实是属于一个范畴的,代码中case1,2,3,4很冗余,这不是一个好代码,怎样用函数指针数组来改善一下呢?可以将函数地址存在数组中,再利用下标引用操作符来调用函数,更改后的主函数为:
**************************************************
//转移表应用实践
int main()
{
int input = 0;
do
{
int a = 0;
int b = 0;
menu();
printf("请选择:");
scanf("%d", &input);
int (*pfarr[5])(int, int) = { 0,Add,Sub,Mul,Div };//函数指针数组
printf("请输入两个操作数:");
scanf("%d %d", &a, &b);
if (input >= 0 && input <= 4)
{
int c = pfarr[input](a, b);
printf("%d\n", c);
}
else if (input == 0)
{
printf("已退出\n");
}
else
{
printf("输入错误,请重新输入:");
}
} while (input);
return 0;
}
*****************************************
这样就没有了重复的代码,通过数组下标来调用函数,简洁明了。函数指针数组像是一个中转站一样来调用函数,这就是转移表。如果有更多的运算功能那么这种转移表的优势将显而易见。
制作不易,感谢观看。