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

C語言指針運算詳解:結構體數組指針遞增訪問成員

     編輯:C 語言問答

代碼片段

struct AB {
    int a;
    float b;
} ab[2] = {{4, 3.0f}, {2, 1.0f}}, *p = ab;

// 求 ++p->b 的值

逐步執行分析

  1. 初始狀態:
    • ab 是包含兩個元素的結構體數組,佈局在內存中連續分佈:
      ab[0]:a=4, b=3.0
      ab[1]:a=2, b=1.0
    • p 初始化為 ab(即 &ab[0]),指向第一個元素。
  2. 表達式 ++p->b 的運算順序:
    • 運算符優先級:-> 高於 ++(前綴)。
    • 結合性:-> 左到右,++ 右到左。
    • 因此 ++p->b 等價於 ++(p->b)?錯誤!
    • 正確解析:p->b 先取 p 指向結構體的成員 b,但 ++ 作用於 p 還是 b?
      實際上 ++p->b 被解析為 ++(p->b),即對 b 成員進行遞增。
      但 原題意圖通常考察指針遞增 ++p 再訪問 ->b,即 (++p)->b。
  3. 按原題最佳答案邏輯(指針遞增優先):
    • ++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 時需注意其已指向下一元素。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved