int a[5]={1,2,3,4,5};
int *p1=(int *)(&a+1);
int *p2=(int *)((int)a+1);
p1,p2分别指向了哪里?printf("%x",p1[-1])会输出什么?
解析:
int *p1=(int *)(&a+1);
其中&的类型是int (*)[5],&a+1表示向前移动一维,就是5个int,然后前置转化为int *,就是说p1指向了a[4]后面的一个位置,可以认为是a[5],所以,printf("%x",p1[-1])会打印a[4]
int *p2=(int *)((int)a+1);
(int)a+1是将数组a地址强制转化为int整型,然后加1,这里的1是指1个字节,不是1个int ,转化后将其指向一个int整型。
之后涉及到大小端,假设为小端,数组中的前两个元素1、2在内存中的布局如下
01 00 00 00 02 00 00 00
p2由于在a的基础上加了1个字节,所以其指向01后面的00,所以p2[0]代表的元素如红色所示
01 00 00 00 02 00 00 00
由于是小端,所以p2[0] = 0x02000000