int a[4]={1,2,3,4};
int *p1=(int*)(&a+1);
int *p2=(int*)((int)a+1);
printf("%x,%x",p1[-1],*p2);
解析:
(1)
数组索引可以是负数,p1[-1]=*(p1-1),
1 2 3 4 未知
a p-1 &a+1
注意&a+1与&a[0]+1的区别,&a[0]+1=&a[1]。
∴p1[-1]=4=0x00000004。
(2)
(int)a后,a不再是指针,(int)a+1就是普通的加1,需要注意普通的+1就是加一个字节,字节是最小的存储单位,加1后通过(int*)((int)a+1)又被强制转换为int型指针。
int 占4字节,所以
_____a[0]=1_____ _____a[1]=2___
B1 B2 B3 B4 B5 B6 B7 B8
00 00 00 01 00 00 00 02 小端
01 00 00 00 02 00 00 00 大端
↑
(int)a+1
--------*p2-------
∴
*p2=0x00000100(小端模式)
注意在大端模式下存储虽然为0x00000002,但别忘了大端模式是高位数据存放在低地址,所以读出数据后实际*p2=0x20000000。
*p2=0x00000002(大端模式)