二维数组的指针访问
—— 王炳华
指向二维数组的指针及用指针访问二维数组,是学习指针的最大难点。如
果真正弄懂了这个问题,就可以说你学会了使用指针。
一、二维数组的指针
指针就是地址,二维数组的指针就是二维数组在内存中的存储地址。相对于一维
数组的地址而言,二维数组的地址稍微复杂一点。
二维数组的地址与一维数组的地址的相同点在于:①、它们的每一个元素都有一
个存储地址(称为元素地址);②、它们都是将全部元素在内存中按顺序占用一段连
续的存储空间;即对于一维数组,下标为 1 的元素的存储单元紧接在下标为 0 的元素
的存储单元之后,下标为 2 的元素的存储单元紧接在下标为 1 的元素的存储单元之
后……直到最后一个元素。对于二维数组,下标为 0 的行的各个元素按顺序存储完之
后,下标为 1 的行的元素紧接其后按顺序存储……直到最后一行的最后一个元素。
二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识
各行起始位置的行首地址(称为行的首地址)。
行的首地址 和 行的首元素的地址 具有相同的地址值,但是它们是两种不同的地
址:若有定义 int a[5][5] ; 则 a[0][0] 是 a 数组首行首列元素(代表该元素的值)。而
&a[0][0] 是 首行首元素的地址 。&&a[0][0] 则是 首行的首地址 。从这个意义上讲,可以
说 行的首地址是一种二重地址 。
二、 行的首地址、行的首元素地址和行的首列元素的值的关系
可以把某行的首地址、某行首列元素的地址、某行首列元素 (代表它的值 ) ,看成
是由高到低的三个层次。
某行首列元素作一次 & 运算得到该行首列元素的地址,某行首列元素的地址再作
一次 & 运算得到该行的首地址。
从这个意义上讲,可以说 元素的地址是一重地址,而行的首地址是二重地址 。
某行的首地址 作一次 * 或 [ ] 运算得到该 行的首元素的地址 ,某 行的首元素的地址
作一次 * 或 [ ] 运算得到该 行的首元素的值 。
三、 运算符 * 、&、[ ] 之间的关系
1. [ ] 运算符
[ ] 是下标运算符,只适用于数组和指向数组的指针变量。其优先级与( )同级,
高于 * 和 & 。结合方向是左结合性(自左至右)。
2 . 三者的关系
* 与 & 互为逆运算
* 与 [ ] 等效
[ ] 与 & 互为逆运算
3 . 作用
前面已经提到:可以把某行的首地址、某行首列元素的地址、某行首列元素 (代
表它的值 ) ,看成是由高到低的三个层次。
* 和 [ ] 都是将运算对象从高层向低 层转化。
& 是将运算对象从低层向高层转化。
如:行的首地址作一次 * 或 [ ] 运算得到该行的首元素的地址。
元素的地址作一次 * 或 [ ] 运算得到该元素的值。
而元素(代表它的值)作一次 & 运算得到该元素的地址。
某行的首元素的地址作一次 & 运算得到该行的首地址。 一
四、 数组名是地址常量
若有定义 int b[5] ;一维数组名 b 是什么?