6、函数指针数组
数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组,比如︰
那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢 ?
int ( *parr1[10] )( ); √
int* parr2[10] ( ); x
int (*)( ) parr3[10]; x
答案是:parr1 parr1先和[结合,说明parr1是数组。
数组的内容是什么呢 ?
是int(*)()类型的函数指针。
练习:
定义一个函数;
char* my_strcpy (char* dest, const char* src);
练习要求:
1.写一个函数指针pf,能够指向my——strcpy
2.写一个函数指针数组 pfArr,能够存放4个my_strcpy函数的地址
答案:
1.char* (pf)(char, const char * )
2.char (*pfArr[4])(char, const char *)
1.函数指针数组的用途
2.制作计算器
转移表 —《C和指针》这本书提及
请看下面简易计算器的例子:
1.使用switch……case语句
这里我们用函数调用的方式实现两个数之间的加、减、乘、除操作,但是当我们想要退出程序的时候,选择0并不能之间退出游戏,还需要进行输入两个操作数,这种方式明显不符合我们的预期,对其稍微进行改造以下:
方法一:
下面我们通过函数指针数组的方式来实现吧!
利用函数指针数组的方式,不仅可以简化我们的代码,也可以方面后面的扩展,比如说后面我们添加一个取模功能或一个异或功能,整个代码仅仅需要进行细微的调整即可满足我们的要求:
这个地方我们仅仅调整了打印的菜单栏,函数指针数组初始化的值以及switch语句中加上case 5,case6。即可满足我们的要求,后续如果进行更多的功能扩展也可以按照这种方式,非常简单。
通过函数指针来实现
我们将这个重复的代码封装到一个函数中:
方法二:
7、指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针
例如:
这种方法代码也比较简洁,扩展性也比较好。
这种方法利用了回调函数,后面会详解回调函数!
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针
如何写出指向函数指针数组的指针呢?
方法一:
①首先我们应该要知道该指针指向的函数指针数组到底是什么?以上面的代码为例:对应的函数指针数组是:int(p3[4])(int, int) = { 0 }; 该函数指针数组的类型是:int()(int, int) //去掉变量名p3和数组[4]剩下的就是数组的类型 int(*)(int,int)
②用指向函数指针数组的指针变量名替换原来的数组变量名,也就是用(p4)替换p3得到的就是int((*p4)[4])(int, int) = &p3;//指向函数指针数组的指针
方法二:
①指向函数指针数组的指针本质上也是指针,所以我们首先写(p4),这个指针指向的一个数组,数组元素个数是4,所以右边要紧接着加上[4],
变成(p4)[4]
②此时要清楚知道数组的元素类型,以上面的代码为例:对应的函数指针数组是:int(p3[4])(int, int) = { 0 }; 该函数指针数组的类型是:int()(int, int) 将①中写好的内容(p4)[4],放到类型int()(int,int) 后面,得到:
int((*p4)[4])(int, int)//指向函数指针数组的指针
扩展:如果我们要继续往下写一个指向函数指针数组的指针数组,可以这样写:
int(*(*p4[3])[4])(int, int)//指向函数指针数组的指针数组