int a[5]={1,2,3,4,5};
int *ptr = (int*)(&a+1);
问: *(a+1)是多少? *(ptr-1)是多少
答:
对一个类型为T的指针来说,比如 T* p
p++或者p+1 等价于 p+sizeof(T) 而不是简单的加1。
对一个数组来说,&a与&a[0]虽然数值相同,但是意义不同:
&a 是“数组a的首地址”,
&a[0]是“数组a首元素的地址”。
所以,&a+1 等价于 “数组a的首地址+sizeof(数组a)”,
1 2 3 4 5 未知 未知
a &a+1
ptr是对(&a+1)进行强制类型转换了,所以
ptr-1 等价于 “数组a的首地址+sizeof(数组a)-sizeof(int)”
1 2 3 4 5 未知
ptr-1 ptr
所以*(ptr-1)=5。
a+1-------数组首地址+sizeof(int)。
&a+1-----数组首地址+sizeof(数组a)
&a[0]+1---数组首地址+sizeof(int)。
所以,*(a+1)=2,*(ptr-1)=5