#指针数组:
###指针数组首先是个数组,其次,数组里面存放的元素是指针类型。
####指针数组的书写形式:
int *arr1[10] //整型指针数组
char *arrr2[5] //字符型一维指针数组
char *arr3[3][2]//字符型二维指针数组
*请注意:由于下标引用符 [ ] 的优先级 高于 解引用操作符 * 所以,arr 先与[] 结合,说明是个数组,在于 结合,说明数组里面的内容是指针类型。
#数组指针:
###数组指针的落点是指针,这个指针指向数组。即指针存放的是数组的地址。
####数组指针的的书写形式:
int ()arr[10] //整型数组指针
char ()arr2[5] //字符型一维数组指针
char (*)arr3[3][2] //字符型二维数组指针
注意:书写时由于操作符优先级的问题,必须先要给 * 加上括号,要先保证是一个指针。
#函数指针:
###函数有自己的地址。
###函数指针同样是个指针,这个指针指向函数。
####函数指针的书写形式:
int (*p) (int , int) // 指针p指向函数,函数的有两个参数,都是整型,函数的返回值是整型
void (pfun)() //pfun先与结合,说明pfun是指针,指针指向函数,该函数没有参数,返回值为空
请注意:函数指针可以类比数组指针的书写形式,但是在书写时需要更加注意。以上面第一个函数指针为例,要写一个返回值是整型的函数指针。
1.保证是个指针,所以 p
2.函数参数类型写在括号中,(int, int ),但是直接写成p(int , int),会改变结合方向,这是对函数解引用,所以对于第一步中的指针写法,必须加上括号
3.在书写返回类型
#函数指针数组:
函数中指针数组 可以 记做:函数指针的数组。由两部分组成,首先是个数组,其次数组里面存放的是函数指针。
####函数指针的书写形式:
int (*arr[10]) (int, int)
char (*arr2[5]) (char, char)
请注意:函数 指针 数组, 只要完成这三者的正确书写就行。一般都是倒着写 先保证是个数组 然后 再是 指针,最后是个函数。以上面第一个为例, []先和 arr结合 ,说明是个数组,在于 结合,说明是个指针,最后将之前写的作为一个整体(当做函数指针的函数名),写入函数指针的形式。*
在实际使用函数指针数组的时候,使用顺序是,先用到数组,根据数组对应的下标找到函数指针,再根据指针调用相应的函数。
#函数指针数组的指针:
###说白了,这就是在函数指针数组基础上加了一个指针,这个指针存放 函数指针数组 的地址,即该指针指向 函数指针数组。
####函数指针数组 的指针的书写形式:
void ((pfun)[10])(const char)
int (()p[5])(int, int) //注释里面写的形式是错误的,但是有助于帮助理解int ()((*p)arr[5]) (int,int)
请注意,函数指针数组 的指针,不难写,但是一定要有套路,按照顺序往下写!
例题:
声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,
该函数的返回值是int,参数是int*,正确的是(C)
A.(int *p[10])(int*)
B. int [10]*p(int *)
C. int (*(*p)[10])(int *)
D. int ((int *)[10])*p
理由如下:
先看未定义标识符p,p的左边是*,*p表示一个指针,跳出括号,由于[]的结合性大于*,
所以*p指向一个大小为10的数组,即(*p)[10]。左边又有一个*号,修释数组的元素,
*(*p)[10]表示*p指向一个大小为10的数组,且每个数组的元素为一个指针。跳出括号,
根据右边(int *)可以判断(*(*p)[10])是一个函数指针,该函数的参数是int*,
返回值是int。所以选C。