一、一维数组
对于一维数组,例如定义int a[6] = {1, 2, 3, 4, 5, 6};
其数组的起始地址为&a[0]或用数组变量a表示,即为起始地址为a或&a[0]。
运行结果为:
可见二者结果相同。
对于一维数组加减常数,例如a[0] + 1,其偏移单位应该是一个数组中存放的对象,若表现在地址偏移上,a[0] + 1 的地址应该是a[0]地址加上数组存放对象所占地址空间。
其结果为:
由于数组存放的数据类型为整型,占用4B,故a[0] + 1 地址上偏移加4B。
二、二维数组
二维数组地址运算较为复杂,可将二维数组的每一行看成为一个一维数组,例如int a[5][4];
数组的首地址可用&a[0][0],&a[0]和表示二维数组的变量a表示。
其结果为:
、
以上三种均可表示二维数组的首地址,其中&a[0]可理解为第一行一维数组的首地址即为二维数组的首地址。
二维数组加减常数,例如+1,可分为三种情况:1、&a + 1
2、 &a[0] + 1
3、&a[0][0] + 1
代码中我们进行了代码复现以及对照组,方便我们理解“+1”的含义:
其结果为:
因此&a + 1中“1”代表整个二维数组,在地址上表现为偏移整个二维数组所占地址空间这里占4*5*4B=80B;&a[0] + 1中“1”代表第0行的一维数组,在地址上表现为偏移一个一维数组所占地址空间,这里占4*4B=16B;&a[0][0] + 1中“1”代表二维数组中一个存放对象,在地址上表现为一个整型量占用空间,这里是一个整型数占4B,所以偏移量为4B。
(注:在讲解二维数组起始地址与讲解+1时起始地址不同,是因为重新编译,数组存放位置重新分配缘故。)
********************************************补充*****************************************
对于二维数组int a[5][4]; 二维数组名a,由前面可知a为二维数组的起始地址。若a + 1 这里的“1”代表加一行元素所占地址空间,即a + 1为第二行起始地址
若想移动至第二行第二个元素则需要起始地址加一行再加一个数据元素,可表示为*(a+1)+1,即为&a[1][1],这里将前面表达式差分开,可描述为:a + 1等价于a[1][0]的地址,而*(a + 1)理解较为困难,我的理解是*(a + 1)为指向a[1][0]的指针,等价于a[1],即为第二行一维数组名。根据指针运算,指针再加一,移动一个数据元素,即*(a + 1) + 1表示将指向a[1][0]的指针移动一个数组元素,即指向a[1][1],该指针即为&a[1][1]。
若想访问该地址数据,则需要对指针解引用,即a[1][1] = *(*(a + 1) + 1);