在 C 語言中,結構體成員訪問有兩種運算符:.(點號)與 ->(箭頭)。掌握它們的適用場景與組合規則,能避免編譯錯誤與運行時崩潰。
| 運算符 | 左側運算元類型 | 語義 |
|---|---|---|
. | **結構體變量(實體/對象)** | 直接訪問成員 |
-> | **結構體指針** | 解引用指針後訪問成員,等價於 (*ptr).member |
當結構體指針訪問的成員**本身是另一個結構體實體**(非指針)時,後續成員訪問**必須改用點號**。
struct Student { int age; int class_; };
struct Class2 { struct Student s1; }; // s1 是實體
struct Class2 *c;
struct Class2 cc = { .s1 = { .age=9, .class_=2 } };
c = &cc;
printf("%d", c->s1->age); // ❌ 編譯錯誤:s1 不是指針,不能用 ->
printf("%d", c->s1.age); // ✅ c 是指針用 ->,s1 是實體用 .
左邊是指針用箭頭,左邊是實體用點號。
一層一層看左側,類型決定用哪個。
c (Class2*)
└─> s1 (Student 實體)
└─. age (int)
若 s1 改為 Student* ps1:
c->ps1->age (兩層皆指針,全用 ->)
request for member 'age' in something not a structure or union → 檢查左側是否為指針卻用了 .,或左側為實體卻用了 ->;ptr != NULL;_Static_assert 驗證類型。成員訪問運算符的選擇**完全取決於左側運算元的類型**,與右側成員無關。養成「先看左、定類型、選運算符」的習慣,即可輕鬆應對任意層級的結構體嵌套。