C++中数组名可以作为数组的首地址使用。数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。对数组名进行运算处理可以看成是对数组地址进行了偏移,而偏移的单位可能是数组中元素的大小,也有可能是整个数组的大小。
1 偏移单位是数组中元素的大小
有如下代码
int ptr[] = {5, 6, 7, 8};
int *pValue = (ptr+1);
ptr
与
pValue
的值如图
1
所示
图1 ptr与pValue的值
从图中可以看到,在表达式中,pValue是ptr偏移了一个“单位”;但是在内存地址中,偏移了0x0073fdfc-0x0073fdf8=4字节,这4个字节即为ptr数组中每个元素(int类型)的大小。
2 偏移单位是整个数组大小
有如下代码
int *pValue = (int*)(&ptr+1);
此时&ptr
与
pValue
的值如图
2
所示。
图2 &ptr与pValue的值
从图中可以看到,在表达式中,pValue是&ptr偏移了一个“单位”;但是在内存地址中,偏移了0x006ff830-0x006ff820=16字节,这16个字节即为ptr数组的大小。
3 偏移单位是一个字节
有如下代码
int *pValue = (int*)((int)ptr+1);
此时,ptr的值看作是一个int,如果此时ptr的值是 0x006ff820,则 ((int)ptr+1)的值是0x006ff821,
那么0x006ff820的地址上对应的值为 05 00 00 00 06 00 00 00 07 00 00 00
那么0x006ff821的地址上对应的值为00 00 00 06 00 00 00 07 00 00 00 08
所以pValue的值是0x06000000,即100663296