2014-02-08 21 views
1

我只是對此代碼的含義有個簡單的問題。對不起,我一直在閱讀其他文章,但是我無法完全理解這個概念,因爲似乎沒有一個類似於我目前在嵌入式系統中工作的這段代碼。解引用已創建的指針

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

有人可以向我解釋這些線是什麼意思?

回答

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()更完全無效)。

+0

sizeof(buf)在memset中做什麼? memset從buf的最左邊位複製「0」?例如[0 0 0 ...] 對不起,但我剛接觸「endian」,但感謝您的幫助! – nciacrklo

+1

'sizeof(buf)'以字節爲單位返回'buf'的大小。在這個例子中,它的大小是int8u的1024倍,所以'sizeof(buf)== 1024'。該memset行將整個'buf'數組初始化爲0。 – Lekensteyn

+0

很多人感謝! \ m /, – nciacrklo

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;的((*)& BUF INT16U [2])通過0xbb01
  2. & BUF [2]是指向INT16U和在BUF通過0xbb01
  3. 更新值更新其值
  4. 更新內容[2],BUF [ 3] by 0xbb01 [#]

[#]:buf [2]的確切內容,buf [3]將取決於核心架構的類型:大端或小端。

+1

謝謝您花時間解釋!豎起大拇指!我也很喜歡你的回答,但可惜不能投2票,但是謝謝你的迴應! – nciacrklo