(int *)(&a+1)

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







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值