# 指针进阶-函数指针-函数指针数组

#include <stdio.h>
int getMax(int a,int b)
{
return a>b?a:b;
}
int getMin(int a,int b)
{
return a>b?b:a;
}
{
return a+b;
}
int dataHandler(int a,int b,int (*pfun)(int,int))
{
int result=0;
result =(pfun)(a,b);
return result;
}
int main()
{
int a=2;
int b=3;
int cmd;
printf("请输入1（求最大值），2（求最小值），3（求和）\n");
int (*pfun)(int,int);
scanf("%d",&cmd);
switch(cmd)
{
case 1: pfun=getMax; break;
case 2: pfun=getMin;break;
}
int value = dataHandler(a,b,pfun);
printf("%d \n",value);
}


函数指针数组

#include <stdio.h>
/*1.传统计算器*/
{
printf("***********请选择计算器功能***********\n");
printf("***********1.加   2.减     ***********\n");
printf("***********3.乘   4.除     ***********\n");
printf("***********   0.退出       ***********\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 input = 0;
int x = 0;
int y = 0;
do {
printf("请选择菜单>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入两个数:");
scanf("%d%d", &x, &y);
break;
case 2:
printf("请输入两个数:");
scanf("%d%d", &x, &y);
printf("%d\n", Sub(x, y));
break;
case 3:
printf("请输入两个数:");
scanf("%d%d", &x, &y);
printf("%d\n", Mul(x, y));
break;
case 4:
printf("请输入两个数:");
scanf("%d%d", &x, &y);
printf("%d\n", Div(x, y));
break;
case 0:
printf("退出！\n");
break;
default:
printf("输入错误！");
break;
}
} while (input);
return 0;
}

我们可以用函数指针数组来实现，来增加效率

#include <stdio.h>
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; }
{
printf("***********请选择计算器功能***********\n");
printf("***********1.加   2.减     ***********\n");
printf("***********3.乘   4.除     ***********\n");
printf("***********   0.退出       ***********\n");
}

/*使用函数指针数组的计算器*/
int main()
{
int input = 0;
int x = 0;
int y = 0;
do {
printf("请选择菜单>");
scanf("%d", &input);
if(input>=1 &&input<=4){
printf("请输入两个数：");
scanf("%d%d",&x,&y);
int ret =Count[input](x,y);
printf("\t\t%d\n",ret);
}
else if(input==0)
{
printf("退出！！\n");
}
else
{
printf("输入错误！！\n");
}
} while (input);
return 0;
}

还有一种方法就是用回调函数，也就是转换表

#include <stdio.h>
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; }

{
printf("***********请选择计算器功能***********\n");
printf("***********1.加   2.减     ***********\n");
printf("***********3.乘   4.除     ***********\n");
printf("***********   0.退出       ***********\n");
}
/*使用回调函数的计算器*/
void Recal(int (*p)(int,int)){
int x = 0;
int y = 0;
printf("请输入两个数:");
scanf("%d%d", &x, &y);
printf("%d\n", p(x, y));
}
int main()
{
int input = 0;
do {
printf("请选择菜单>");
scanf("%d", &input);
switch (input)
{
case 1:
break;
case 2:
Recal(Sub);
break;
case 3:
Recal(Mul);
break;
case 4:
Recal(Div);
break;
case 0:
printf("退出！\n");
break;
default:
printf("输入错误！");
break;
}
} while (input);
return 0;
}

• 0
点赞
• 0
收藏
• 打赏
• 0
评论
09-19 108
07-11 582
09-20 691
01-20 1694
05-24 25万+
08-03
03-13 1656
10-11

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

xd07

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。