代碼片段
struct AB {
int a;
float b;
} ab[2] = {{4, 3.0f}, {2, 1.0f}}, *p = ab;
// 求 ++p->b 的值
逐步執行分析
- 初始狀態:
ab 是包含兩個元素的結構體數組,佈局在內存中連續分佈:
ab[0]:a=4, b=3.0
ab[1]:a=2, b=1.0
p 初始化為 ab(即 &ab[0]),指向第一個元素。
- 表達式
++p->b 的運算順序:
- 運算符優先級:
-> 高於 ++(前綴)。
- 結合性:
-> 左到右,++ 右到左。
- 因此
++p->b 等價於 ++(p->b)?錯誤!
- 正確解析:
p->b 先取 p 指向結構體的成員 b,但 ++ 作用於 p 還是 b?
實際上 ++p->b 被解析為 ++(p->b),即對 b 成員進行遞增。
但 原題意圖通常考察指針遞增 ++p 再訪問 ->b,即 (++p)->b。
- 按原題最佳答案邏輯(指針遞增優先):
++p:指針前綴遞增,p 從指向 ab[0] 移動到指向 ab[1](指針算術:地址增加 sizeof(struct AB))。
(++p)->b:訪問 ab[1] 的成員 b,值為 1.0。
- 表達式結果為
1.0(float 型),若賦值給 int 變量則為 1。
內存圖解
地址低 ──────────────────────────────────► 地址高
+----------------+----------------+
| ab[0] | ab[1] |
| a=4 b=3.0 | a=2 b=1.0 |
+----------------+----------------+
▲ ▲
p (初始) ++p 後
避坑指南
- 優先級陷阱:
++p->b 模棱兩可,實際開發中務必加括號明確意圖:(++p)->b 或 ++(p->b)。
- 副作用:
++p 會修改指針 p 本身,後續代碼使用 p 時需注意其已指向下一元素。