【问题标题】:dereferencing a created pointer取消引用创建的指针
【发布时间】:2014-02-08 14:20:33
【问题描述】:

我只是想问一下这段代码的含义。抱歉,一直在阅读其他帖子,但我无法完全理解这个概念,因为似乎没有一个类似于我目前在我的嵌入式系统中工作的这段代码。

int8u buf[1024];
memset(buf, 0, sizeof(buf));
*((int16u*)&buf[2]) = 0xbb01;

谁能给我解释一下这些行是什么意思?

【问题讨论】:

    标签: pointers reference dereference


    【解决方案1】:

    它基本上将字节数组buf 解释为16 位字,然后将第二个字更改为0xbb01。替代表示:

    int8u buf[1024];
    memset(buf, 0, sizeof(buf));
    
    int16u *words = buf;
    buf[1] = 0xbb01;
    

    &buf[2] 将地址带到buf 中的第二个字节。然后转换为(int16u *) 通知编译器结果将被视为16 位无符号整数。最后,将该地址上的内存设置为0xbb01

    根据您系统的字节顺序,buf 的内容可能是 0x00, 0x00, 0xbb, 0x010x00, 0x00, 0x01, 0xbb(由于memset(),后面跟着更多的 NUL)。

    【讨论】:

    • sizeof(buf) 在 memset 中有什么作用? memset 从 buf 的最左边复制“0”对吗?例如[0 0 0 ... ] 抱歉,我是“endian”的新手,但感谢您的帮助!
    • sizeof(buf) 返回buf 的大小(以字节为单位)。在此示例中,它将是 int8u 大小的 1024 倍,因此是 sizeof(buf) == 1024。该 memset 行将整个 buf 数组初始化为 0。
    • 非常感谢伙计! \m/,
    【解决方案2】:

    解释请看代码注释

    int8u buf[1024];                  // intializing int array of size 1024 in RAM. 
    
    memset(buf, 0, sizeof(buf));      // fill in buffer with zero. 
    

    (int16u*)&buf[2] 是指向 int16 的指针的类型转换。这里的转换被赋予 &buf[2],即 buf[2] 的地址。

    *((int16u*)&buf[2]) = 0xbb01;  //  updating content of int16 -two byte intger starting at buf2
    

    为什么要这样做?

    这是因为 buf 数组是由 int8u 创建的。现在我们需要更新 int16 值0xbb01。为此,在上面的代码中我们创建了 int16 指针。

    上面指针的逐步简化

    1. ((int16u)&buf[2]) = 0xbb01;
    2. 将 ((int16u*)&buf[2]) 的内容更新为 0xbb01
    3. &buf[2] 是指向 int16u 的指针,并将其值更新为 0xbb01
    4. 将 buf[2],buf[3] 处的值更新为 0xbb01。[#]

    [#]:buf[2]、buf[3] 的具体内容取决于核心架构的类型:大端或小端。

    【讨论】:

    • 感谢您花时间解释!竖起大拇指!我也喜欢你的回答,但遗憾的是不能投票 2,但谢谢你的回应好先生!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2019-05-20
    相关资源
    最近更新 更多