(int *)(&a+1)

来源:互联网 发布:百度cdn端口 编辑:程序博客网 时间:2024/06/17 22:16

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