C++中对数组名的运算

C++中数组名可以作为数组的首地址使用。数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。

1 一维数组

以下代码定义了一个有4个元素的int数组

int b[] = {1, 2, 3, 4};


1.1 与数组名相关的运算

对数组b的运算,例如b&b[0]&b等表达式的值如图所示。

 

1 对于数组名b的运算

其中,b表示数组b的起始地址(以int为单位);&b表示数组b的起始地址(以int[4]为单位);&b[0]表示数组b第一个元素的地址。

1.2 b&b的区别

从图1中可以看出,b的类型是int[4],而&b的类型是int[4]*。可以将b看成是以int为单位,而&b是以int[4]为单位的,如图2所示。

 

2 b&b的区别

从图2中可以看出,对b1个“单位”,即b+1的值是在b的地址0x007dfcec的基础上加上1int的长度,0x007dfcec+4=0x007dfcf0。对&b加上1个“单位”,即&b+1的值是在b的地址0x007dfcec的基础上加上1int[4]的长度,0x007dfcec+4*4=0x007dfcfc。两者关系如图3所示。

C++中对数组名的运算_第1张图片 

3 b&b的关系

2 二维数组

以下代码定义了一个维数为2×2的数组

int a[2][2] = { {1,2}, {3,4} };

可以将a看成一个数组,这个数组中有2个元素,每个元素又是一个包含2int的数组。

2.1 与数组名相关的操作

与数组a相关的操作如图4所示。

C++中对数组名的运算_第2张图片 

4 与数组a相关的操作

其中a[0][0]表示数组中的第一个元素;a表示数组的起始地址,a[0]表示将a看成包含2个数组元素时,第一个数组的地址,其单位为int*a[0]表示将a看成包含2个数组元素时,第一个数组的第一个元素的值;&a[0]则表示将a看成包含2个数组元素时,第一个数组的地址,其单位为int[2]

2.2 a+1&a+1&a[0]+1的区别

正如b&b的区别”中提到的“单位”,a+1&a+1&a[0]+1的区别也是单位不同,如图5所示。

 

5 a+1&a+1&a[0]+1的区别

“2 二维数组中提到,可以将a看成一个数组,这个数组中有2个元素,每个元素又是一个包含2int的数组,所以a的“单位”是int[2],即包含2int的数组,所以a+1的值是在a的值0x007dfd04的基础上加上int[2]的长度,即0x007dfd04+8=0x007dfd0c&a的“单位”是int[2][2],即2个包含2int的数组,所以&a+1的值是在a的值0x007dfd04的基础上加上int[2][2]的长度,即0x007dfd04+8*2=0x007dfd14a[0]的“单位”是1int的长度,所以a[0]+1的值是在a[0]的值0x007dfd04的基础上加上int的长度,即0x007dfd04+4=0x007dfd08

你可能感兴趣的:(C++基础)