指针-数组-加常数

#include<stdio.h>
 int main ()
 {

     int a[4]={1,2,3,4};
     int * ptr1=(int *) (&a+1);
     int * ptr2=(int *) ((int)a +1);
     printf("%x\n %x\n",&a[0],&a[1]);
     printf("%x  %x",ptr1[-1],*ptr2);
     return 0;
     /****结果******/
     /*
     22FEF8
     22FEFC
     4   2000000

     */
 }

通常X86机器采用的小段存储

Base Address+0 Byte0
Base Address+1 Byte1
Base Address+2 Byte2
Base Address+3 Byte3

MOTO机器采用大端存储

Base Address+0 Byte3
Base Address+1 Byte2
Base Address+2 Byte1
Base Address+3 Byte0 
本题内存结构如图
[1000]  [2000] [3000] [4000] [5000]  地址[5000]没有的 &a+1 地址就是 [4000]地址加一 这里表示[5000] ptr1[-1]值为 [4000] 即4
(int *) ((int)a +1) 首先a是数组首地址 转换成int型22FEF8即为int型 ((int)a+1) 变成了22FEF9 (移动一个字节) 输出时为2000000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值