含义:函数指针,顾名思义是一种指针,是一种指向函数的指针
函数指针能更好的指向目标函数的地址,方便函数的调用,能方便的将函数作为参数传递调用,还能作为转换表
例如:利用函数指针实现简单的函数调用
#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;
}
int AddNum(int a,int b)
{
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;
case 3:pfun=AddNum;break;
}
int value = dataHandler(a,b,pfun);
printf("%d \n",value);
}
函数指针数组
含义:函数指针数组,顾名思义是一个数组,用来存放函数指针的数组
格式: int (*parr[10])={Add,Sub,...};
如:实现简单的计算器程序(加减乘除)
传统的计算器我们会用这种方法,但是这种方法书写效率非常低,代码冗余量非常大
#include <stdio.h>
/*1.传统计算器*/
void menu()
{
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 {
menu();
printf("请选择菜单>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入两个数:");
scanf("%d%d", &x, &y);
printf("%d\n", Add(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; }
void menu()
{
printf("***********请选择计算器功能***********\n");
printf("***********1.加 2.减 ***********\n");
printf("***********3.乘 4.除 ***********\n");
printf("*********** 0.退出 ***********\n");
}
/*使用函数指针数组的计算器*/
int main()
{
int input = 0;
int x = 0;
int y = 0;
int (*Count[5])(int,int)={0,Add,Sub,Mul,Div};
do {
menu();
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; }
void menu()
{
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 {
menu();
printf("请选择菜单>");
scanf("%d", &input);
switch (input)
{
case 1:
Recal(Add);
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;
}