啊我摔倒了..有没有人扶我起来学习....
前言
铁汁们都知道,指针对C/C++来说就是灵魂,而同类型指针又能封装到数组中。本文就来讲讲函数指针数组的应用场景
一、函数指针数组是什么?
- 顾名思义,xxxxxx数组,所以函数指针数组就是一种数组,数组里的元素都是函数指针罢了。
- 是怎样识别出上述是一个函数指针数组呢?很简单,首先变量
p
是和[10]
结合的,说明它是个数组,然后把这个整体拿开,剩下的部分就是这个数组的类型,这个类型就是函数指针void(*)(int,int)
二、函数指针数组应用场景
2.1 具体问题
咱们都接触过,写扫雷、三子棋、通讯录等时,都会用上以下
switch
代码实现菜单的选择
//通讯录主函数部分
int main()
{
int input = 0;
struct Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 7:
DestoryContact(&con);
break;
case 0:
printf("退出通讯录!\n");
break;
default:
printf("选择错误!请重新输入\n");
break;
}
}while(input);
return 0;
}
- 但是会发现,使用的函数越多,
switch
的分支就越多,这样的代码太过繁琐。于是我们就可以用函数指针数组进行优化
2.2 使用函数指针数组优化
- 我们的目的是把上述代码的函数统一集中管理,那么我们就需要收集它们的地址,于是想到用一个个函数指针存起这些地址,而这一个个函数指针就可以统一放进一个数组里存起来,这个数组就是对应的函数指针数组
- 首先我们要知道,函数指针数组里面存放的函数指针,都是同一个类型的,比如
void(*p[10])(int,int)
数组里面都是void(*)(int,int)
指针,这个要特别注意 - 刚好,上述代码中需要统一管理的函数都是同个类型
void p(struct Contact*)
(具体问题具体分析,这边不赘述整体代码了),参数部分是结构体指针,返回值是void
。那么需要把这种函数的地址存起来,就需要void(*p)(struct Contact*)
的函数指针。然后,要把这种类型的指针存起来,就需要void(*p[])(struct Contact*)
的函数指针数组 - 于是定义一个这样的函数指针数组并赋值(这边顺便把退出通讯录也封装了一个函数)
void (*Menu[8])(struct Contact*)={ExitContact,
AddContact,
DelContact,
SearchContact,
ModifyContact,
ShowContact,
SortContact,
DestoryContact};
- 使用的时候,就通过输入的input当做该数组的下标进行索引,此时再带上实参就行啦
Menu[input](&con);
- 下面附上优化后的代码
//通讯录主函数部分
int main()
{
int input=0;
struct Contact con;
InitContact(&con);
void (*Menu[8])(struct Contact*)={ExitContact,
AddContact,
DelContact,
SearchContact,
ModifyContact,
ShowContact,
SortContact,
DestoryContact};
while(1)
{
menu();
printf("请输入:>");
scanf("%d",&input);
if(input>=0 && input<=7)
Menu[input](&con);
else
printf("输入非法,请重新输入!\n");
}
return 0;
}
三、总结
- 优化之后代码整洁直观了许多,主要思想就是统一打包。相信函数指针数组还有很多应用场景,快去试试叭~