函数指针数组
我们先来看一下什么是函数指针,
有一个函数
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); }
通过数组下标找到元素,再通过元素找到函数
完美!!!
等等等等,再说明一点
函数指针数组的用途是:转移表!