• 指针和数组的千丝万缕(三)


    假设在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

  • 相关阅读:
    jquery插件:web2.0分格的分页脚,可用于ajax无刷新分页
    Application共享数据
    WebClient类
    HttpResponse类
    IEqualityComparer<T>接口
    物理数据库设计 理解浮点数
    Server对象,HttpServerUtility类,获取服务器信息
    Linq to OBJECT之非延时标准查询操作符
    IComparer<T> 接口Linq比较接口
    会话状态Session
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007634.html
Copyright © 2020-2023  润新知