#include <iostream>
int main(){int a[5] = {1,2,3,4,5};int* p= (int*)(&a+1);printf("%d",*(p-1)); // 这段代码会输出4
}
原因:
array和&array的值是一样的,但是他们代表的意义完全不一样,array是数组首元素的首地址(和&array[0]
一样),&array是整个数组array的首地址.
“+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位。
- 即array+1:在数组首元素的首地址的基础上,偏移一个
sizeof(array[0]
)单位。此处的类型T就是数组中的一个int型的首元素。 - 即&array+1:在数组的首地址的基础上,偏移一个sizeof(array)单位。此处的类型T就是数组中的一个含有5个int型元素的数组。
注意:在以下两中场合下,数组名并不是用指针常量来表示:
当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a
后返回的指针便是指向数组的指针,跟a(一个指向a[0]
的指针)在指针的类型上是有区别的。