c语言进阶:指针的进阶(下)
回调函数
我们还是以计算器为例来解释回调函数的使用
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf("***********************\n");
printf("1:add 2:sub\n");
printf("3:mul 4:div\n");
printf("***********************\n");
printf("请选择 ");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("%d\n", ret);
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
我们可以发现 case1 2 3 4里面有大量冗余的代码
那么我们可不可以通过一定的手段解决这个问题呢?
答案是可以 就是使用回调函数
定义
回调函数就是一个被作为参数传递的函数。
我们来设计一个case_()函数 并且将add div这些函数作为参数传递进去
要求: 可以实现和原函数一样的功能 代码不能冗余
void calc(int(*p)(int x, int y))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = p(x, y);
printf("%d\n", ret);
}
这就是上面思想指导写出来的代码
完整代码如下
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 calc(int(*p)(int , int ))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个操作数\n");
scanf("%d %d", &x, &y);
ret = p(x, y);
printf("%d\n", ret);
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf("***********************\n");
printf("1:add 2:sub\n");
printf("3:mul 4:div\n");
printf("***********************\n");
printf("请选择 ");
scanf("%d", &input);
switch (input)
{
case 1:
calc(add);
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
让我们试试它的运行结果
可以完美运行的
本来是向给大家分上下两期讲完指针进阶的 但是好像上一期写的太多内容了 这一期只有一个回调函数可以写
还有大量的指针题目我想放到配套作业专栏里去
那这一期就先这样啦
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯