zoukankan      html  css  js  c++  java
  • 指针和数组的千丝万缕(三)

    假设在x86(小端)上运行以下代码:
    char undata[100];
    short out,i;
    for(i=0; i<100; i++)
        undata[i] = i;
    out = *(short*)((int*)undata + 1);

    咋一看最后一句,还真是有点晕,一会儿int*,一会儿short*不过仔细分析以下,还是有头绪的。
    话说执行完for循环之后,数组undata的值就变为0,1,2,3,4,5,6,......97,98,99;每一个元素均占用一个(char)字节大小。(int*)undata是把这100个数字在整合成以int类型的数组,就是把0,1,2,3整合为一个数组来访问,4,5,6,7整合为一个数组来访问,一次类推,而内存里的数是不变的,只是编译器在访问的时候均已一个int类型大小的跨度来访问,那么可以看成(100/4)25个int类型的元素了。
    在CPU=x86,OS=winxp,compiler=mingw32,通过GDB调试下来验证。

    这里undate的地址为0x22ff08,下面的调试显示了一切!


    还有记住在x86的架构里,数据均已小端的方式存储的,就是我常提到的“小低低(弟弟)”,且看下面:

    数据

    D

    00000000

    10000000

    01000000

    11000000

    00100000

    10100000

    01100000

    11100000

    00010000

    B

    0

    1

    2

    3

    4

    5

    6

    7

    8

    address

    0x22ff08

    0x22ff09

    0x22ff0a

    0x22ff0b

    0x22ff0c

    0x22ff0d

    0x22ff0e

    0x22ff0f

    0x22ff10

    int

    int

    short

    short

    然后out=0000 0101 0000 0100 = 2^10+2^8+2^2 = 1284

  • 相关阅读:
    简单的代码
    js精度缺失问题
    maven将Jar安装进仓库
    上传图片,手机端压缩
    处理登录时,AJAX的状态码无权限情况
    处理html换行问题
    VMWARE网络配置内网与外网互ping
    hbase和ZooKeeper集群安装配置
    Hadoop集群部署
    redis主从配置+sentinel哨兵
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007634.html
Copyright © 2011-2022 走看看