int a[5] = {11, 22, 33, 44, 55};
int *p = a;
printf("%d\n", *p++);
printf("%d\n", *(p++));
疑問:*p++ 和 *(p++) 優先級相同(自右向左結合),但為何表現為「先取值,後指針加 1」?不是應該先執行 ++ 再解引用 * 嗎?
++(後置)優先級高於 *(解引用)。++ 的結合性為自左向右,但作為一元運算符,其操作數是緊鄰的變量。*p++ 等價於 *(p++):先使用 p 的當前值解引用,然後將 p 指向下一個元素(p = p + 1)。p 指向 a[0](地址值假設為 0x1000)。printf("%d\n", *p++);
p 當前值(0x1000)解引用 → 獲取 a[0] = 11。p 後置自增 → p 變為 0x1004(指向 a[1])。printf("%d\n", *(p++));
p 指向 a[1],解引用獲取 22。p 再次自增指向 a[2]。| 表達式 | 含義 | 示例結果 |
|---|---|---|
*p++ | 先取值,指針後移 | 輸出當前元素,指針指向下一個 |
*++p | 指針先移,再取值 | 指針指向下一個,輸出新元素 |
++*p | 取值後,該元素值加 1 | 修改數組內容,指針不變 |
「後置自增,先用後加;前置自增,先加後用。」指針運算中,p++ 返回舊地址,++p 返回新地址。