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

C 語言指針運算陷阱:後置遞增導致變量值出乎意料

     編輯:程式設計疑難解答

指針是 C 語言的核心也難點,結合後置遞增運算符 ++ 時極易產生誤解。以下代碼輸出為何是 4,4 而非 3,4?

int a = 0, *ptr;
ptr = &a;
*ptr = 3;
a = (*ptr)++;
printf("%d,%d\n", a, *ptr); // 輸出 4,4

逐步拆解

  1. int a = 0, *ptr; 定義整型變量 a 與整型指針 ptr。
  2. ptr = &a; ptr 指向 a 的地址。
  3. *ptr = 3; 通過指針修改 a 的值為 3,此時 a = 3。
  4. a = (*ptr)++; 關鍵步驟:
    • (*ptr) 取值為 3。
    • 後置 ++ 先使用當前值(3)參與賦值,再將 *ptr 所指內存值加 1 變為 4。
    • 因為 ptr 指向 a,*ptr 即 a,所以 a 先被賦值為 3,隨即因指向同一地址而變為 4。
  5. 最終 a = 4,*ptr = 4,輸出 4,4。

核心知識點

  • 後置遞增:表達式值為遞增前的值,副作用是變量加 1。
  • 指針別名:ptr 與 a 共享同一記憶體單元,修改 *ptr 即修改 a。
  • 運算順序:賦值運算符 = 優先級低於後置 ++,但 (*ptr)++ 作為右值整體參與賦值。

避坑建議

  • 避免在同一語句中對同一變量進行取值與修改(如 a = a++ 行為未定義)。
  • 拆分為兩句:a = *ptr; (*ptr)++; 邏輯清晰無歧義。
  • 使用調試器單步觀察內存與寄存器變化,深化理解。

指針與運算符結合是考試與面試高頻考點,務必掌握運算順序與副作用機制。

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