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

C語言結構體成員訪問:箭頭(->)與點(.)運算符規則詳解

     編輯:關於C語言

C語言結構體成員訪問:箭頭(->)與點(.)運算符規則詳解

在 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;
  • 調試建議:在 IDE 中懸停查看變量類型,或加入靜態斷言 _Static_assert 驗證類型。

總結

成員訪問運算符的選擇**完全取決於左側運算元的類型**,與右側成員無關。養成「先看左、定類型、選運算符」的習慣,即可輕鬆應對任意層級的結構體嵌套。

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