一.函数指针
1.定义理解
- 函数指针:是一个指针,存放函数地址的指针。
- 函数的地址可以通过取地址函数名拿到,也可以通过函数名直接拿到。
2.函数指针
(1)定义一个函数test
void test(char *str)
{
printf("%s\n",str);
}
int main()
{
//函数指针的定义方式
void (*p)(char *str) = test;
return 0;
}
(2)函数指针的使用
//调用函数test,传参:zhangsan
(*p)("zhangshan");
这里的*没有起作用,它是让我们知道这是一个指针然后解引用了一下。所以可以简化一下:(下面的写法也正确)
p("zhangsan");
(3)一些函数指针举例
//add函数
int (*p)(int x,int y)=add;
//调用
p(2,3);
//sub函数
int (*p)(int x,int y)=sub;
//调用
p(2,3);
这些函数指针类型都相同,因此我们考虑能不能把这些函数指针放到一个数组中呢?接下来我们引入一个函数指针数组。
二.函数指针数组
1.定义理解
- 存放相同类型函数指针的数组。
2.函数指针数组
①定义一个函数指针数组
int (*p[4])(int,int)={add,sub,mul,div};
该函数指针数组包含四个函数指针,分别指向add函数,sub函数,mul函数,div函数,每一个函数的参数都是两个int型的参数。
②调用函数
//调用add函数
P[1](8,4);--->输出12
//调用sub函数
P[2](8,4);--->输出4
//调用mul函数
P[3](8,4);--->输出32
//调用div函数
P[4](8,4);--->输出2
三.指向函数指针数组的指针
1.定义理解
- 针对刚刚上面存放了add,sub,mul,div四个函数的地址的指针数组p,既然p是一个数组,那么我们可以对p进行取地址,取出来的是数组的地址,要将这个地址存放起来我们需要一个指针,我们称作指向函数指针数组的指针。
2.函数指针数组的指针
那么函数指针数组的指针该如何书写呢?
我们还是以上面的函数指针数组p为例。
int (*(*pp)[4])(int x,int y)=&p;
//这里的pp就是存放了函数指针数组p的指针
小总结
到这里为止大家可能对这些比较绕,我们来总结一下。
①函数指针
int (*p)(int , int);
(这是一个指针,指向一个函数)
②函数指针数组
int (*p[4])(int ,int);
(这是一个数组,数组有四个元素,每个元素是一个指向函数的指针)
③指向函数指针数组的指针
int (*(*p)[4])(int ,int);
(这是一个指针,指向一个数组,这个数组有四个元素,每个元素是一个指向函数的指针)