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

C 語言基礎:結構體核心知識體系總結

     編輯:關於C

聚合數據類型對比

特性數組結構體
元素類型相同可不同
訪問方式下標 [i]成員名 . / ->
內存佈局連續、等長連續、長度可變、含填充
類型屬性非標量(退化為指針)標量(可賦值、傳參、返回)

結構體聲明完整語法

struct tag {
    member-list;
} variable-list;

三部分至少出現兩個:

  • tag:類型標籤,用於後續聲明
  • member-list:成員列表(類型 + 名字)
  • variable-list:變量定義列表

三種聲明形式

  1. 無標籤,直接定義變量:
    struct { int a; char b; float c; } x;
    每次聲明都是獨立類型,即使成員相同也不能互賦值
  2. 帶標籤,分離聲明與定義:
    struct SIMPLE { int a; char b; float c; };
    struct SIMPLE x, y[20], *z;
    同一標籤聲明的變量類型兼容
  3. typedef 創建類型別名:
    typedef struct { int a; char b; float c; } Simple;
    Simple x, y[20], *z;
    Simple 成為類型名,用法同 int,跨文件共享建議放在頭文件

成員訪問操作符

  • .:直接訪問,左操作數為結構體變量
  • ->:間接訪問,左操作數為指針,等價於 (*ptr).member

自引用結構體:鏈表節點的關鍵

❌ 非法:成員為完整結構體

struct SELF_REF1 {
    int a;
    struct SELF_REF1 b; // 遞歸定義,無限大小
    int c;
};

✅ 合法:成員為指針

struct SELF_REF2 {
    int a;
    struct SELF_REF2 *b; // 指針大小固定,編譯器可確定結構體大小
    int c;
};

❌ 錯誤:typedef 內部使用未定義類型名

typedef struct {
    int a;
    SELF_REF3 *b; // SELF_REF3 此處尚未定義
    int c;
} SELF_REF3;

✅ 正確:結合標籤與 typedef

typedef struct SELF_REF3_TAG {
    int a;
    struct SELF_REF3_TAG *b;
    int c;
} SELF_REF3;

不完整聲明:相互依賴結構體

struct B; // 前向聲明

struct A {
    struct B *partner;
};

struct B {
    struct A *partner;
};

先聲明標籤 struct B;,再在 A 中使用指針,最後定義 B 完整結構。

結構體初始化

  • 花括號包裹,逗號分隔,按成員順序
  • 嵌套結構體/數組初始化可再嵌套花括號
  • 初始化項不足時,剩餘成員零初始化
struct INIT_EX {
    int a;
    short b[10];
    Simple c;
} x = {
    10,
    {1,2,3,4,5},      // 部分初始化數組
    {25, 'x', 1.9}    // 初始化嵌套結構體
};

重點總結

  1. 結構體是標量,支持賦值、傳參、返回值
  2. 同名不同標籤的結構體是不同類型
  3. 自引用必須用指針,配合標籤實現
  4. 跨文件共享結構體類型,放在頭文件用 typedef 或標籤聲明
  5. 初始化支持嵌套、部分初始化、零補全
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved