1、一个数组,各元素都是指针变量,每元素保存一个地址,这样的数组称为指针数组。
定义指针数组:int *r[3];该语句表示定义了一个指针数组,数组名是r,它有3个元素。由于r前有*标志,数组每个元素都将是一个指针变量,分别保存一个地址。
指针数组的定义也可写为以下语句:int *(r[3]);
注意:[]的优先级高于*([]与()优先级是相同的,都是最高的)。指针数组各元素的基类型必须相同,同一数组的各元素都要指向相同类型的变量。
2、由于指针变量都是占用4个字节,因此指针数组的每个元素必然也都占用4个字节,且与指针数组的基类型无关。举例:double *dd[3];则dd[0]、dd[1]、dd[2]这三个指针变量也都占用4个字节,因为它们都保存一个地址。double 是指这些地址所指向的数据的类型,不是说dd[0]、dd[1]、dd[2]本身是double。
3、指针数组也是数组,普通数组的规律仍适用于指针数组。下面讨论指针数组的数组名r
(1)、r是数组名(指针数组的数组名)。
(2)、r是一个假想的“二级指针变量”,它“保存”另一指针变量的地址(地址的地址)。
(3)、指针变量r所“保存”的值为指针数组的首地址,也即元素r[0]的地址(二级地址)。
(4)、指针变量r本身的地址(r所在内存字节编号)是指针数组的地址,数值上与元素r[0]的地址相等。
(5)、r值不可被改变,是常量。
4、由于指针数组的数组名r是“第二类”的二级指针变量,与行指针不同,因此如定义int (*q)[4];也不能通过执行语句q=r;来保存r的值(两类二级之间也应看做不同的级)。如何保存r这种“第二类”的二级指针变量的值呢?需要定义另一种专用的指针变量:int **s;即在定义指针变量时,在变量名前加上连续的两个**。这两个*都是标志,这种指针变量称为指向指针的指针。这种指针变量时第二类的二级指针变量,存放的也是二级地址,可专用于保存指针数组的数组名这种二级地址。
int **s;这样的第二类二级指针变量或指针数组名+(-)n都是前进或后退4*n个字节。
指针数组名+(-)n或指针的指针+(-)n=地址值+(-)4*n
无论是指针数组名r还是指针的指针s,它们同样适用于语法糖公式:r[i]<=>*(r+i)、s[i]<=>*(s+i)
5、int **s;这样的指针变量(指向指针的指针)与指针数组名r也可以是等效的。在程序中不仅可用数组名r访问指针数组的各个数组元素,还可以用指针变量s来访问。s[0]就是r[0] s[1]就是r[1].