簡體   English   中英

難以理解C指針語法

[英]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;

它指示編譯器

  1. p的值保存為p1。
  2. 增量
  3. 解除引用p1
  4. rval的值分配給解除引用的東西。

編輯注意:除非你清楚運算符優先級,否則我永遠不會寫*p++因為它非常混亂。 我通過明確地寫*(p++)來明確我的意圖。

Postfix ++的優先級高於一元* ,因此*p++形式的表達式被解析為*(p++) ; IOW,你正在取消引用p++結果

這在您的代碼中是什么意思?

給定表達式*pCommandData++ = SYNC_BYTE_1 ,這里是對正在發生的事情的粗略解釋:

  1. 表達式pCommandData++被評估。 表達式的結果pCommandData的當前值,它是一個指針值。 作為副作用 ,更新pCommandData的值。 什么時候是無法超越的事實,則必須在下一個序列點之前出現指定發生此更新。

  2. 表達式pCommandData++結果使用*運算符解除引用。 這個更大的表達式的結果是一個左值 (一個表達式,它指向內存中的一個對象,以便我們可以讀取或修改該對象)。

  3. 我們將值SYNC_BYTE_1分配給在步驟2中計算的左值。

在語義上,它與寫作相同:

*pCommandData = SYNC_BYTE_1;
 pCommandData++;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM