首先,认识一下函数指针
void (prt)(int x, int y)
这就是一个很简单的函数指针,prt先和解引用操作符结合说明这是一个指针,后面跟调用操作符()表示这个指针指向一个函数,函数的参数是两个int 型,返回一个void。
函数指针数组,就是一个存放函数指针的数组。
int ( * prt[10])(int x, int y)
prt先和[]结合说明它是一个数组,它存储的是int ()(int x, int y)型的函数指针。
下面简单的编写一个计算器程序来展示一下函数指针数组的用法:
普通的方法应该是这样的,利用分支来选择要执行的操作
#include<stdio.h>
#include<stdlib.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;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
while (input)
{
printf("******************************\n");
printf(" 1.add 2.sub\n");
printf(" 3.mul 4.div\n");
printf(" 0.exit \n");
printf("******************************\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("输入操作数:");
scanf("%d%d", &x, &y);
ret = Add(x, y);
break;
case 2:
printf("输入操作数:");
scanf("%d%d", &x, &y);
ret = Sub(x, y);
break;
case 3:
printf("输入操作数:");
scanf("%d%d", &x, &y);
ret = Mul(x, y);
break;
case 4:
printf("输入操作数:");
scanf("%d%d", &x, &y);
ret = Div(x, y);
break;
case 0:
printf("退出游戏!");
break;
default:
printf("输入错误\n");
break;
}
printf("ret = %d\n", ret);
}
return 0;
}
如果使用了函数指针,那main函数就能简化很多,子函数不变,在主函数中定义一个函数指针数组来存储函数地址。
int main()
{
int x, y;
int input = 1;
int ret = 0;
int (*p[5])(int x, int y) = { 0, Add, Sub, Mul, Div };
while (input)
{
printf("******************************\n");
printf(" 1.add 2.sub\n");
printf(" 3.mul 4.div\n");
printf(" 0.exit \n");
printf("******************************\n");
printf("请选择:");
scanf("%d", &input);
if ((input <= 4 && input >= 1))
{
printf("输入操作数:");
scanf("%d%d", &x, &y);
ret = (*p[input])(x, y);
}
else
{
printf("输入有误");
}
printf("ret = %d\n", ret);
}
return 0;
}