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

C語言聯合體與枚舉:節省內存的藝術與常量管理最佳實踐

     編輯:關於C語言

聯合體:多變量共享一塊內存

聯合體 是一種特殊的構造類型,允許多個不同類型的成員共用同一塊內存區域。任意時刻,只能存儲其中一個成員的值。

1. 定義與聲明

union Data {
    int i;
    float f;
    char str[20];
} data; // 定義聯合體變量 data

// 或分離聲明
union Data { int i; float f; };
union Data data;

2. 內存佈局與大小

  • 大小 = 最大成員的大小(按對齊要求調整)。
  • 所有成員偏移量均為 0,即從同一地址開始。
  • 修改任一成員,會覆蓋其他成員的位模式。

3. 經典案例:整數與字節分解

union {
    int i;
    struct { char high, low; } bytes;
} converter;

converter.i = 0x4241; // 'B' 'A'
printf("%c%c\n", converter.bytes.high, converter.bytes.low); // 輸出 AB (大端序) 或 BA (小端序)

converter.bytes.high = 'a';
converter.bytes.low = 'b';
printf("%x\n", converter.i); // 輸出 6261 ('b' 'a' 的 ASCII)

應用:網絡字節序轉換、硬件寄存器位域訪問、類型懲罰。

4. 聯合體 vs 結構體

特性結構體聯合體
內存佈局成員依次排列,互不重疊成員完全重疊,共用地址
大小所有成員大小之和(含對齊)最大成員大小(含對齊)
同時存活所有成員同時存在僅一個成員有效
賦值影響互不干擾覆蓋其他成員
典型用途聚合相關數據節省空間、類型轉換、變長數據

5. 進階:嵌套與匿名聯合體

struct Packet {
    int type;
    union {
        struct { int x, y; } mouse;
        struct { int key; } keyboard;
        char raw[64];
    } data; // 匿名聯合體 (C11)
};

// 訪問
p.data.mouse.x = 100;
printf("%d\n", p.data.raw[0]); // 查看原始字節

枚舉:賦予常量語義名稱

枚舉 定義一組命名的整型常量,增強代碼可讀性與類型安全(編譯器可檢查 switch 覆蓋)。

1. 定義語法

enum Weekday { SUN, MON, TUE, WED, THU, FRI, SAT };
enum Weekday today = MON;

// 顯式指定值
enum Status { OK = 0, ERR_MEM = -1, ERR_IO = -2, ERR_NET = -3 };
// 後續成員自動 +1
enum Flags { F1 = 1, F2 = 2, F3 = 4, F4 = 8 }; // 位掩碼常用

2. 關鍵規則

  • 默認從 0 開始,遞增 1。
  • 可指定負數,後續仍遞增 1。
  • 枚舉常量作用域遵循標識符規則(C 為標籤作用域,C++ 為枚舉作用域)。
  • 枚舉變量實際類型為 int(或兼容整型),可隱式轉換。

3. 實戰優勢

// 魔術數字消除
if (status == ERR_IO) { /* ... */ }

// switch 完整性檢查 (GCC/Clang -Wswitch-enum)
switch (day) {
    case MON: case TUE: case WED: case THU: case FRI: work(); break;
    case SAT: case SUN: rest(); break;
    // 缺少 default,編譯器警告未處理枚舉值
}

4. 與宏對比

特性#defineenum
類型安全無有(編譯器知類型)
調試可見不可見(預處理替換)可見(符號表保留)
作用域全局(文件級)遵循塊作用域
分組關聯無強語義分組

總結

  • 聯合體:以空間換靈活,實現同一內存的多重解讀,嵌入式、協議解析必備。
  • 枚舉:以名稱替代數字,提升可讀性、可維護性、編譯器輔助能力,現代 C/C++ 首選常量定義方式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved