[英]Difficulty Understanding C Pointer Syntax
鑒於以下C定義:
#define SYNC_BYTE_1 0x5A
#define SYNC_BYTE_2 0xA5
和指針聲明:
UINT8 *pCommandData;
pCommandData = GetCommandBufferPointer( LINGO_GENERAL, stringLength + 3 );
以下兩行代碼到底是做什么的?
*pCommandData++ = SYNC_BYTE_1;
*pCommandData++ = SYNC_BYTE_2;
我特別不明白在這個例子中使用*
和++
。 如果指針的地址正在遞增,那么*
應該用&
替換?
pCommandData
是指向某段內存的指針。 第一行
*pCommandData++ = SYNC_BYTE_1;
將該地址的值設置為0x5A
,然后將指針pCommandData
遞增到下一個地址。 下一行
*pCommandData++ = SYNC_BYTE_2;
工作方式類似:它將pCommandData
指向的值設置為0xA5
,然后將指針遞增到下一個地址。
也許一張照片會很有用。 在任一行執行之前, pCommandData
指向的鄰居中的內存可能如下所示:
| |
+--------+
pCommandData -----> | |
+--------+
| |
+--------+
| |
+--------+
| |
在*pCommandData++ = SYNC_BYTE_1;
:
| |
+--------+
pCommandData --+ | 0x5A |
| +--------+
+--> | |
+--------+
| |
+--------+
| |
並且在*pCommandData++ = SYNC_BYTE_2;
:
| |
+--------+
pCommandData --+ | 0x5A |
| +--------+
| | 0xA5 |
| +--------+
+--> | |
+--------+
| |
這個:
UINT8 *pCommandData;
*pCommandData++ = SYNC_BYTE_1;
*pCommandData++ = SYNC_BYTE_2;
相當於:
UINT8 *pCommandData;
*pCommandData = SYNC_BYTE_1;
pCommandData++;
*pCommandData = SYNC_BYTE_2;
pCommandData++;
要么:
UINT8 *pCommandData;
pCommandData[0] = SYNC_BYTE_1;
pCommandData[1] = SYNC_BYTE_2;
pCommandData += 2;
構造:
* pCommandData ++ = SYNC_BYTE_1;
簡單的意思是將pCommandData
指向的值設置為SYNC_BYTE_1
,然后將指針遞增以指向下一個位置。 由於pCommandData
是指向無符號8位整數的指針,這意味着它將遞增以指向下一個(后續)8位值。
指針本身正在遞增,指向下一個字節。
這的工作方式與編寫完全相同:
*pCommandData = value;
pCommandData++;
您可以使用&pCommandData
來獲取指針本身的地址,但這不是這里發生的事情。 使用*pCommandData
可以訪問指針指向的對象(如果有的話:-)。
的效果:
*pCommandData++ = SYNC_BYTE_1;
是:
*pCommandData = SYNC_BYTE_1;
pCommandData++;
pCommandData指向的數據塊設置為0x5A
,然后指針設置為下一個字節,該字節本身設置為0xA5
。 最后,指針被設置為內存中的下一個字節。
您可以將代碼重寫為以下內容:
*pCommandData = SYNC_BYTE_1;
pCommandData = pCommandData + 1;
*pCommandData = SYNC_BYTE_2;
pCommandData = pCommandData + 1;
它將同步字節值放入pCommandData,這就是為什么你看到* pCommandData,然后你將它遞增到下一個字節。
表達方式
*p++ = rval ;
被讀為
*(p ++)= rval;
它指示編譯器
p
的值保存為p1。 rval
的值分配給解除引用的東西。 編輯注意:除非你清楚運算符優先級,否則我永遠不會寫*p++
因為它非常混亂。 我通過明確地寫*(p++)
來明確我的意圖。
Postfix ++
的優先級高於一元*
,因此*p++
形式的表達式被解析為*(p++)
; IOW,你正在取消引用p++
的結果 。
這在您的代碼中是什么意思?
給定表達式*pCommandData++ = SYNC_BYTE_1
,這里是對正在發生的事情的粗略解釋:
表達式pCommandData++
被評估。 表達式的結果是pCommandData
的當前值,它是一個指針值。 作為副作用 ,更新pCommandData
的值。 什么時候是無法超越的事實,則必須在下一個序列點之前出現指定發生此更新。
表達式pCommandData++
的結果使用*
運算符解除引用。 這個更大的表達式的結果是一個左值 (一個表達式,它指向內存中的一個對象,以便我們可以讀取或修改該對象)。
我們將值SYNC_BYTE_1分配給在步驟2中計算的左值。
在語義上,它與寫作相同:
*pCommandData = SYNC_BYTE_1;
pCommandData++;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.