我对这段代码的含义有一个简短的问题。很抱歉,一直在阅读其他帖子,但我无法完全掌握这个概念,因为似乎没有一个类似于我目前在我的嵌入式系统中工作的代码。
int8u buf[1024];
memset(buf, 0, sizeof(buf));
*((int16u*)&buf[2]) = 0xbb01;
有人可以向我解释这些行是什么意思吗?
答案 0 :(得分:0)
它基本上将字节数组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)。
答案 1 :(得分: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]将取决于核心架构的类型:big endian或small endian。