我只是對此代碼的含義有個簡單的問題。對不起,我一直在閱讀其他文章,但是我無法完全理解這個概念,因爲似乎沒有一個類似於我目前在嵌入式系統中工作的這段代碼。解引用已創建的指針
int8u buf[1024];
memset(buf, 0, sizeof(buf));
*((int16u*)&buf[2]) = 0xbb01;
有人可以向我解釋這些線是什麼意思?
我只是對此代碼的含義有個簡單的問題。對不起,我一直在閱讀其他文章,但是我無法完全理解這個概念,因爲似乎沒有一個類似於我目前在嵌入式系統中工作的這段代碼。解引用已創建的指針
int8u buf[1024];
memset(buf, 0, sizeof(buf));
*((int16u*)&buf[2]) = 0xbb01;
有人可以向我解釋這些線是什麼意思?
它基本上將字節數組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()
更完全無效)。
請查看代碼的註釋進行說明
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]將取決於核心架構的類型:大端或小端。
謝謝您花時間解釋!豎起大拇指!我也很喜歡你的回答,但可惜不能投2票,但是謝謝你的迴應! – nciacrklo
sizeof(buf)在memset中做什麼? memset從buf的最左邊位複製「0」?例如[0 0 0 ...] 對不起,但我剛接觸「endian」,但感謝您的幫助! – nciacrklo
'sizeof(buf)'以字節爲單位返回'buf'的大小。在這個例子中,它的大小是int8u的1024倍,所以'sizeof(buf)== 1024'。該memset行將整個'buf'數組初始化爲0。 – Lekensteyn
很多人感謝! \ m /, – nciacrklo