首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言指針運算符 * 與自增 ++ 結合時的執行順序深度解析

     編輯:程式設計綜合問答

問題代碼

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)。

逐步執行過程

  1. 初始:p 指向 a[0](地址值假設為 0x1000)。
  2. 執行 printf("%d\n", *p++);
    • 取 p 當前值(0x1000)解引用 → 獲取 a[0] = 11。
    • 輸出 11。
    • p 後置自增 → p 變為 0x1004(指向 a[1])。
  3. 執行 printf("%d\n", *(p++));
    • 當前 p 指向 a[1],解引用獲取 22。
    • 輸出 22。
    • p 再次自增指向 a[2]。

關鍵區別:前置 vs 後置自增

表達式含義示例結果
*p++先取值,指針後移輸出當前元素,指針指向下一個
*++p指針先移,再取值指針指向下一個,輸出新元素
++*p取值後,該元素值加 1修改數組內容,指針不變

記憶口訣

「後置自增,先用後加;前置自增,先加後用。」指針運算中,p++ 返回舊地址,++p 返回新地址。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved