指针数组/数组指针

指针数组:
指针数组是数组,是一个存放指针的数组。
这里写图片描述
这里的a[4]就是一个指针数组,其中各元素的类型都是int*。

数组指针:
数组指针是指针,这个指针指向一个数组。
这里写图片描述
这里的P是一个指针,指向一个内部元素类型为int型的数组。

上面两个例子都是非常简单的形式,那么当遇到复杂形式时,该如何判断呢?
我们可以这样来看它:
我们看变量名先和什么结合,它和什么先结合,那么它最终的类型就是什么。比如:int * a[4] 中,变量名a先和[]结合(为什么是先和[]结合,不是先和 * 结合呢?因为[]的优先级高于 * ),那么它最终就是一个数组。同理,int( * p )[4]中,p先和 * 结合,那么它最终就是一个指针。然后具体的类型再逐层向外分析。

函数指针:
函数指针是指针,指向一个函数。
比如:int ( * pfun)(int, int) ; pfun先与 * 结合,它就是一个指针,这个指针指向一个函数,这个函数有两个int型参数并且返回值类型为int。

函数指针数组:
函数指针数组是数组,数组中的元素是指针,这些指针都指向函数。
比如:int( * pfunarr[5])(int, int) = { NULL ,myadd, mysub, mymul, mydiv, };其中pfunarr先与[5]结合,则其是数组,再与 * 结合,则是指针数组,再有int型返回值与两个int型参数,于是确定其为返回值为int型,参数为两个int型的函数指针数组。
举个应用例子:

指向函数指针数组的指针:
由以上函数指针数组的说明我们认识了函数指针数组,那么这个就好理解了,也就是有一个指针指向这个函数指针数组。在上个例子的基础上举例。
比如:int ( * ( * ppfunarr)[5])(int, int) = &pfunArr; 其中ppfunarr先与 * 结合,确定其是指针;再与 [5]结合,是指针数组;再与 (int, int)结合,是函数指针数组,再与 * 结合,确定其为指向函数指针数组的的指针。

综合以上说明画个图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36391130/article/details/78695061