int Add(intx,inty){
return x+y;
}
int main(){
int x=10;
int y=20;
int ret=Add(x,y);
printf("%d",ret);
}
函数名Add
函数地址为Add,(也就是函数名)
函数指针,是用来存放函数地址的指针
那么我们看这个加法函数的地址就是Add
所以 我们怎么用函数指针,来存放这个Add函数地址呢?
int (*pa) (int,int)=Add
这是一个函数指针,函数地址为pa,(*pa)代表是一个指针,什么指针呢接着往下看,是个指向(int,int)函数参数类型为int的指针,返回类型为int.
这就是我们函数指针,那么函数指针数组是什么呢?
我们再来了解一下指针数组。
int* arr[10]={0};
这是一个名叫arr数组,里面存放着10个元素,每个元素的元素类型为int* ,然后需要给这个数组初始化。
回归正题,函数指针数组是什么呢?
int (*pa[ 元素个数]) (int,int)={初始化}
这就是一个函数指针数组,本质上是一个数组,用来存放函数指针,数组名字为pa 参数有【】,*其他剩余的就是数组类型int ()(int,int),这是一个函数指针类型**。
我们来看函数指针数组的用途
我们来写一个代码,实现一个计算器。
void menu() {
printf("******************************************\n");
printf("******1.ADD 2.Jian*************\n");
printf("*******3.Cheng 4.Chu**************\n");
printf("********* 0.退出 ******************\n");
printf("******************************************\n");
}
int Add(int x, int y) {
return x + y;
}
int Jian(int x, int y) {
return x - y;
}
int Cheng(int x, int y) {
return x * y;
}
int Chu(int x, int y) {
return x / y;
}
int main() {
int input = 0;
int x = 0;
int y = 0;
do {
menu();
printf("请选择菜单\n");
scanf("%d", &input);
switch (input) {
case 1:
printf("请输入两个数\n");
scanf("%d%d", &x, &y);
printf("%d\n", Add(x, y));
break;
case 2:
printf("请输入两个数\n");
scanf("%d%d", &x, &y);
printf("%d\n", Jian(x, y));
break;
case 3:
printf("请输入两个数\n");
scanf("%d%d", &x, &y);
printf("%d\n", Cheng(x, y));
break;
case 4:
printf("请输入两个数\n");
scanf("%d%d", &x, &y);
printf("%d\n", Chu(x, y));
break;
case 0:
printf("退出\n");
break;
default:
printf("输入有误\n");
break;
}
} while (input);
}
这是我们利用普通的函数来实现的 这段代码,出现多处重复语句,总的来说就是太死板,太麻烦,如果我要添加一项其他的计算规则,又要去switch语句中,添加规则,到时候我的switch语句就老长老长了,代码出现任何问题,维护上来说也是难上加难!
我们来通过函数指针数组来简化这样的代码
void menu() {
printf("******************************************\n");
printf("******1.ADD 2.Jian*************\n");
printf("*******3.Cheng 4.Chu**************\n");
printf("********* 0.退出 ******************\n");
printf("******************************************\n");
}
int Add(int x, int y) {
return x + y;
}
int Jian(int x, int y) {
return x - y;
}
int Cheng(int x, int y) {
return x * y;
}
int Chu(int x, int y) {
return x / y;
}
int main() {
int input = 0;
int x = 0;
int y = 0;
int(*pa[5])(int, int) = { 0,Add,Jian,Cheng,Chu };
do {
menu();
printf("请选择菜单\n");
scanf("%d", &input);
if (input >= 1 && input <= 4) {
printf("请输入两个数\n");
scanf("%d%d", &x, &y);
int ret = pa[input](x,y);
printf("%d\n", ret);
}
else if (input == 0) {
printf("退出");
}
else {
printf("选择错误\n");
}
} while (input);
}
通过数组下标找到元素,再通过元素找到函数
完美!!!
等等等等,再说明一点
函数指针数组的用途是:转移表!
原文:https://blog.51cto.com/u_15100290/2694928