指针和数组有着密切的关系,任何能由数组下标完成的操作也都可用指针来实现,但程序中使用指针可使代码更紧凑、更灵活。
一、指向数组元素的指针
我们定义一个整型数组和一个指向整型的指针变量:
inta[10],*p;
和前面介绍过的方法相同,可以使整型指针 p 指向数组中任何一个元素,假定给出赋值运算
p=&a[0];
此时,p 指向数组中的第 0 号元素,即 a[0],指针变量 p 中包含了数组元素 a[0]的地址,由于数组元素在内存中是连续存放的,因此,我们就可
以通过指针变量 p 及其有关运算间接访问数组中的任何一个元素。e
TurboC 中,数组名是数组的第 0 号元素的地址,因此下面两个语句是等价的
p=&a[0];
p=a;
根据地址运算规则,a+1 为 a[1]的地址,a+i 就为 a[i]的地址。
下面我们用指针给出数组元素的地址和内容的几种表示形式:
(1).p+i 和 a+i 均表示 a[i]的地址,或者讲,它们均指向数组第 i 号元素,即指向 a[i]。e
(2).*(p+i)和*(a+i)都表示 p+i 和 a+i 所指对象的内容,即为 a[i]。e
(3).指向数组元素的指针,也可以表示成数组的形式,也就是说,它允许指针变量带下标,如 p[i]与*(p+i)等价。
假若:p=a+5;
则 p[2]就相当于*(p+2),由于 p 指向 a[5],所以 p[2]就相当于 a[7]。而 p[-3]就相当于*(p-3),它表示 a[2]。
二、指向二维数组的指针e
1.二维数组元素的地址e
为了说明问题,我们定义以下二维数组:
inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
a 为二维数组名,此数组有 3 行 4 列,共 12 个元素。但也可这样来理解,数组 a 由三个元素组成:a[0],a[1],a[2]。而每个元素又是一个
一维数组,且都含有 4 个元素(相当于 4 列),例如,a[0]所代表的一维数组所包含的e4个元素为 a[0][0],a[0][1],a[0][2],a[0][3]。如图所示:
_____________________
a---|a[0]|____|0|1|2|3|
|______||___|___|___|___|
|a[1]|____|4|5|6|7|
|______||___|___|___|___|
|a[2]|____|8|9|10|11|
|______||___|___|___|___|
但从二维数组的角度来看,a 代表二维数组的首地址,当然也可看成是二维数组第 0 行的首地址。a+1 就代表第 1 行的首地址,a+2 就代
表第 2 行的首地址。如果此二维数组的首地址为 1000,由于第 0 行有 4 个整型元素,所以 a+1 为 1008,a+2 也就为 1016。如图所示
_______________
(1000)____|0|1|2|3|
|___|___|___|___|
(1008)____|4|5|6|7|
|___|___|___|___|
(1016)____|8|9|10|11|
|___|___|___|___|