1. 指针数组
是数组,是一个存放指针的数组
例1:int *arr1[3]; //是一整型指针数组,该数组中有3个元素,每个元素均为指向整型数据的指针
char *arr2[4]; //同理,是一字符型指针数组,该数组中有4个元素,每个元素均为指向字符型数据的指针
注意:[ ]的优先级比*的优先级高,所以,arr先与[ ]结合,形成数组,又因为有个*,所以为指针数组
例2:char **arr3[2];
按照上述的判断方法,arr3先与[ ]结合,形成数组,又因为char **,所以为二级指针数组,即该数组有2个元素,每个元素均为一个二级指针
2. 数组指针
是指针,是指向数组的指针,存放数组的地址
例3:int (*p)[10];
由优先级知,因为有()的存在,p先与*结合,形成指针,所以该变量为指针变量;
此时,把(*p)看做一个变量整体,如a,则原式就变为:int a[10];该变量为整型数组;
所以两部分结合起来即为数组指针。
在本例中,指针p指向一个有10个元素的整型数组。
注意:在表示为指针时,因为[]比*的优先级高,所以一定要加().
例4:char (*pc)[5]; //该变量为指向具有5个元素的字符数组的指针
例5:int (*p[10])[5]; //数组指针数组
首先,由优先级,p先与[10]结合,所以该变量即为数组
其次,将p[10]看做一个整体,如a,则与变量即为int (*a)[5]
最后,由上述例3可知新的变量int (*a)[5]为数组指针
所以,结合起来,原变量即为数组指针数组。
例6:int *(*p)[10]; //指针数组指针
首先,()的优先级最高,所以p先与*结合,形成指针,所以该变量即为指针
其次,将(*p)看做一个整体a,则原变量变为 int *a[10]
最后,由上述例1知,int *a[10]为一指针数组
所以,原变量即为指针数组指针。
3. 函数指针
是指针,是指向函数的指针,存放函数的起始地址。
函数的地址即为第一条指令的地址,通常函数的地址可以函数名或者&+函数名表示。
例7:void (*pfun1)(); //该变量为函数指针
首先,()的优先级最高,所以pfun1先与*结合形成指针,故该变量为指针
其次,将(*pfun1)看做一个整体a,原变量可看*结合做 void a();
最后,void a()即为函数。
所以,原变量即为函数指针。
例8:void *pfun2(); //指针函数
因为()的优先级最高,所以pfun先与()结合形成函数
然后再与*结合形成指针,故原变量为指针函数。
4. 函数指针数组
例9:int (*p[10])();
该变量为函数指针数组
首先,在()中,[]的优先级最高,所以p先与[]结合形成数组,整体记为a,所以该变量即为数组。
其次,在()中,a与*结合形成指针,(*a)整体即为b,原变量变为int b()
最后,int b()即为函数
所以,原变量为函数指针数组。
注意:函数指针数组是一数组,数组每个元素存放函数指针,即存放函数的地址,所以可以很多函数集合在一数组中。
每次调用一个函数,引用一次数组即可实现,因此,函数指针数组可被用作转移表,简化程序代码。
5. 指向函数指针数组的指针
是一指针,该指针指向数组,数组每个元素为函数指针,即数组中存放函数的地址
例10:void (*(*pfun)[10])()
首先,在中间的()优先级最高,所以pfun先与*结合,形成指针,故,该变量即为指针。将(*pfun)看做一整体a
其次,原变量变为void (*a[10])(),由上述例9可知,void (*a[10])()为一函数指针数组
所以,原变量即为函数指针数组的指针。