比较有趣的题1

int arr[4] = { 1, 2, 3, 4 };
int i = *(int *)((int)arr + 1);
printf("%x\n",i);

  就上面的代码而言输出值你认为是多少?

  答案如下:

  为什么会是这个数字,我当时也很奇怪后面请教老师以及参考资料才把这道题搞明白,我先画个图先了解一下题意

  不知道这个图看不看的懂,因为是int类型的数组所以一个数组格子里面有4个字节,那么数组地址是4个4个往上走,所以我上面写的地址(这个地址不是真实地址,是我自己虚拟的)是100 104 108 112。原先arr可以看作指针指向下标为0的数据就是我用红色框起来的。但题上面将arr强转成了整形,就是说现在arr不是指针了,变成了数字,这个数字就是100,现加一,又强转成了指类型那么现在的位置就是我用蓝色框起来的,然后解引用,算出这个格子里的数字是多少。那这个格子里的数字是多少

 

 

 

       因为电脑是小端所以数据的存储形式如上图所示,刚开始arr指向的是红色格子框起来的数据,经过题上的+1现变成了蓝色格子框起来的数据,数据再转回因该表示的样子就是00000010 00000000 00000000 00000000 用16进制表示就是2000000。 

 

 

 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值