函数指针数组
数组是一个用来存放相同类型数据的存储空间,顾名思义,函数指针数组的本质是数组,是用来存放函数指针的数组。我们来对比一下不用函数指针数组和用函数指针数组来实现简单的仅可以加减乘除的计算器
用switch的方式来写
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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)
{
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;
}
int main()
{
menu();
int way = 0;
int x = 0;
int y = 0;
do
{
printf("请选择计算方式:");
scanf("%d", &way);
if (way <= 4 && way >= 1)
{
printf("请输入操作数:");
scanf("%d %d", &x, &y);
}
switch (way)
{
case 1:
printf("%d\n", Add(x, y));
break;
case 2:
printf("%d\n", sub(x, y));
break;
case 3:
printf("%d\n", mul(x, y));
break;
case 4:
printf("%d\n", div(x, y));
break;
case 0:
printf("退出程序");
default:
printf("选择有误,请重新选择!!\n");
break;
}
} while (way);
return 0;
}
我们可以看到,代码整体是比较冗余复杂的,特别是switch那里,以后要是想加入其他算法进去,又还要case5,case6…等等,我们也不难发现,这里加减乘除的函数返回值和计算的值都是整形的形式,那我们可不可以把这些函数封装在一个数组里面呢?答案是可以的。
用函数指针数组的方式
首先我们来说一下,函数指针数组的创建方式:
函数创建部分不变,主函数部分改变
代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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)
{
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;
}
int main()
{
int x = 0;
int y = 0;
int way = 0;
menu();
int (*p[5])(int, int) = { NULL,Add,sub,mul,div };
do
{
printf("请选择计算方式:");
scanf("%d", &way);
if (way <= 4 && way >= 1)
{
printf("请输入操作数:");
scanf("%d %d", &x, &y);
int ret = p[way](x,y);
printf("%d\n", ret);
}
else if(way==0)
{
printf("推出程序!");
}
else
{
printf("输入有误,请重新输入!\n");
}
} while (way);
return 0;
}