zoukankan      html  css  js  c++  java
  • 指针和数组的学习

    在msOS的代码里有这个两句话
    //first put in data, then increase u8MsgHead
    ((U8 *)(&(u16MsgArray[u8MsgHead])))[0] = MsgType;
    ((U8 *)(&(u16MsgArray[u8MsgHead])))[1] = Val;
    抛开他们所执行的具体意义,仅从C语言层面上去理解。
    u16MsgArray是文中定义的数组:
    static U16 data u16MsgArray[MSG_ARRAY_SIZE];
    MSG_ARRAY_SIZE的值为4,4个short类型的数组,u8MsgHead取值范围0~3


    咋一看,不理解什么意思,于是乎在电脑上调试了,平台为eclipse+mingw


    实验代码如下:
    unsigned short u16MsgArray[4]={
    0,1,2,3
    };

    ((unsigned char *)(&(u16MsgArray[0])))[0] = 4;
    ((unsigned char *)(&(u16MsgArray[0])))[1] = 5;


    运行后的结果为:u16MsgArray[4]={
    1284,1,2,3
    };


    1284=0x504=0b'101 0000 0100


    分析:
    &(u16MsgArray[0])意为首元素的地址,可以理解为指针;
    (unsigned char *)(&(u16MsgArray[0]))意为转换为unsigned char的指针,为了理解,记:
    unsigned short *u16_ptr = &(u16MsgArray[0]);(注意不能写成unsigned short *u16_ptr = u16MsgArray;即使指针的值不变,但这两个语句的意义不同,后续的指针转换也就不同了)。


    这里的u16_ptr是数组指针,指向数组的指针,(顺便提一句,*u16_ptr[9]中的u16_ptr是指针数组的数组名)
    然后再进行如下操作:
    ((unsigned char *)u16_ptr)[0] = 5;
    ((unsigned char *)u16_ptr)[1] = 6;
    ((unsigned char *)u16_ptr)[2] = 4;


    u16MsgArray数组的值更新为:
    {0x605,0x4,0x2,0x3}


    注意,x86是小端模式,高地址存高位数,和我们平时写的数字是反着的,看着有些别扭,也佩服CPU的设计者。
    内存地地址—————>高地址
    u16MsgArray[0]—>u16MsgArray[3]
    0x0022fee0—————>0x0022fee6
    0506 0400 0200 0300
    在测试中,添加((unsigned char *)(&(u16MsgArray[0])))[-1] = 7;
    内存中显示(u16MsgArray[-1]) = 1792.
    其中
    &(u16MsgArray[-1]) = 0x0022fede
    0x0022fede——>0x0022fee0—————>0x0022fee6
    0007 0506 0400 0200 0300
    以上的内存分布在eclips的memory里查看的


    虽然在内存中,u16MsgArray[0]的显示为0506,但是实际的值为0x0605,即1541,这和变量的值一致的(eclipse的Variables查看的)。
    同理:0x700 = 1792。
  • 相关阅读:
    P5362 [SDOI2019]连续子序列 思维题
    P5360 [SDOI2019]世界地图 虚树+最小生成树
    P4565 [CTSC2018]暴力写挂 边分治+虚树
    BZOJ2870. 最长道路tree 并查集/边分治
    P4103 [HEOI2014]大工程 虚树
    P4220 [WC2018]通道 虚树+边分治
    P3261 [JLOI2015]城池攻占 可并堆
    积水问题
    23. 合并K个排序链表
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007533.html
Copyright © 2011-2022 走看看