【发布时间】:2014-02-08 14:20:33
【问题描述】:
我只是想问一下这段代码的含义。抱歉,一直在阅读其他帖子,但我无法完全理解这个概念,因为似乎没有一个类似于我目前在我的嵌入式系统中工作的这段代码。
int8u buf[1024];
memset(buf, 0, sizeof(buf));
*((int16u*)&buf[2]) = 0xbb01;
谁能给我解释一下这些行是什么意思?
【问题讨论】:
标签: pointers reference dereference
我只是想问一下这段代码的含义。抱歉,一直在阅读其他帖子,但我无法完全理解这个概念,因为似乎没有一个类似于我目前在我的嵌入式系统中工作的这段代码。
int8u buf[1024];
memset(buf, 0, sizeof(buf));
*((int16u*)&buf[2]) = 0xbb01;
谁能给我解释一下这些行是什么意思?
【问题讨论】:
标签: pointers reference dereference
它基本上将字节数组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, 0x01 或 0x00, 0x00, 0x01, 0xbb(由于memset(),后面跟着更多的 NUL)。
【讨论】:
sizeof(buf) 返回buf 的大小(以字节为单位)。在此示例中,它将是 int8u 大小的 1024 倍,因此是 sizeof(buf) == 1024。该 memset 行将整个 buf 数组初始化为 0。
解释请看代码注释
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 指针。
上面指针的逐步简化
[#]:buf[2]、buf[3] 的具体内容取决于核心架构的类型:大端或小端。
【讨论】: