【C语言】函数指针、函数指针数组、函数指针数组的指针

一.函数指针

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) 
(这是一个指针,指向一个数组,这个数组有四个元素,每个元素是一个指向函数的指针
 

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/86019347