1. 转移表
函数指针数组用途转移表
举例:计算机的一般实现
要实现加减乘除先要先创建他们分别的函数,那我们可以看到4个函数除了名字不一样以外,函数的返回类型,参数类型都是一样的,那我们可以把他们都放到一个函数指针数组里面
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;
}
函数指针数组类型被重命名为 tparr
创建一个函数指针数组 arithmetic 然后初始化把4个函数的地址存进去
typedef int (*tparr[4])(int, int);
int main()
{
tparr arithmetic = { add, sub, mul, div};
return 0;
}
简单的调用看看
int main()
{
tparr arithmetic = { add, sub, mul, div};
printf("add = %d\n", arithmetic[0](4, 5));
return 0;
}
运行没有问题,add = 9
计算方法没有问题,我们要实现可以自由选择想要乘就乘, 想加就加,我们还要实现可以计算多次,这里选择用 do while 来做循环实现多次选择,选择了还的判断吧,所以用了 if 判断选择了什么方法, 这些都好了那我们想要给人选择方法那得给别人知道有什么方法吧,做一个选择菜单出来。
void meun()
{
printf("**** 请选择: ***\n");
printf("********************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("*** 0.end ***\n");
printf("********************\n");
}
int main()
{
tparr arithmetic = { add, sub, mul, div};
int choose = 1;
do
{
meun();//菜单
scanf("%d", &choose);
if (choose <= 4 && choose >= 1)//判断方法
{
printf("请输入俩个数:\n");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
printf("= %d\n", arithmetic[choose - 1](x, y));//choose - 1
//因为用的是下标所以要减一
}
else if (choose == 0)//退出
{
printf("正在退出\n");
}
else//判断输入错误的数
{
printf("选择错误,请重新选择\n");
}
} while (choose);// 0 就退出
return 0;
}
运行一下没有问题,这就是函数指针数组的简单运用了
2. 回调函数
回调函数就是一个通过函数指针调用的函数。
回调函数就是通过另一个函数,来调用这个函数,就是回调函数;
用回调函数来修改一下上面的代码
void meun()
{
printf("**** 请选择: ***\n");
printf("********************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("*** 0.end ***\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;
}
void p(int(*pa)(int x, int y))//把要重复的内容都写入一个函数,
{ //来重复调用这个函数来重复调用这个函数的内容
int x = 0;
int y = 0;
printf("请输入俩个操作数:\n");
scanf("%d %d", &x, &y);
int ret = pa(x, y);
printf("= %d\n", ret);
printf("____________________\n");
}
int main()
{
int choose = 1;
do
{
meun();
scanf("%d", &choose);
switch (choose)
{
case 1 ://通过调用函数 p(),把 add 的地址传给这个函数,再由这个函数来调用add
p(add);
break;
case 2 :
p(sub);
break;
case 3:
p(mul);
break;
case 4:
p(div);
break;
case 0:
printf("已退出\n");
default:
printf("输入错误,请重新选择\n");
}
} while (choose);
return 0;
}
运行结果也是一样不过这个 main 看着更简洁一点.