取消引用创建的指针

时间:2014-02-08 14:20:33

标签: pointers reference dereference

我对这段代码的含义有一个简短的问题。很抱歉,一直在阅读其他帖子,但我无法完全掌握这个概念,因为似乎没有一个类似于我目前在我的嵌入式系统中工作的代码。

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

有人可以向我解释这些行是什么意思吗?

2 个答案:

答案 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, 0x010x00, 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指针。

逐步简化上述指针

  1. ((int16u )& buf [2])= 0xbb01;
  2. 用0xbb01更新((int16u *)& buf [2]的内容)
  3. & buf [2]指向int16u并通过0xbb01更新其值
  4. 更新buf [2]的值,buf [3]更新为0xbb01。[#]
  5. [#]:buf [2]的确切内容,buf [3]将取决于核心架构的类型:big endian或small endian。