構造類型讓C語言能描述複雜數據結構。本文系統講解枚舉、結構體(聲明、初始化、成員訪問、傳參、數組、指針操作)、typedef 別名機制及聯合體內存共享特性。
enum枚舉本質是整型常量的別名,增強代碼可讀性。
enum COLOR {BLACK, RED, BLUE}; // 值為 0,1,2
enum COLOR {RED=1, YELLOW, BLUE}; // 值為 1,2,3
enum COLOR c = RED;
用途:替代 #define 或 const int 定義相關常量集合,具備類型檢查優勢。
struct// 方式1:先聲明類型,再定義變量
struct Point { int x; int y; };
struct Point p1;
// 方式2:匿名結構體,直接定義變量(無法復用類型)
struct { int x; int y; } p1, p2;
// 方式3:聲明類型同時定義變量
struct Point { int x; int y; } p1, p2;
struct Point p1 = {10, 20}; // 順序初始化
struct Point p2 = {.y = 30}; // C99 指定成員初始化,其餘為0
struct Point p3 = p1; // 整體賦值(淺拷貝)
p1.x = 5; // 成員訪問
.:結構體變量訪問成員(p1.x)->:結構體指針訪問成員(ptr->x 等價於 (*ptr).x)
// 值傳遞:拷貝整個結構體,函數內修改不影響外部
void func_val(struct Point p) { p.x = 99; }
// 指針傳遞:傳遞地址,函數內可修改原值(推薦大結構體)
void func_ptr(struct Point *p) { p->x = 99; }
原則:大結構體傳指針避免拷貝開銷;需修改原值必須傳指針。
struct Point points[3] = {{1,2}, {3,4}, {5,6}};
points[1].x = 10;
typedef 類型別名為現有類型創建別名,簡化聲明,增強可移植性。
typedef int Length; // 基礎類型別名
Length a, b; // 等價於 int a, b;
typedef struct { // 匿名結構體 + typedef
int x, y;
} Point; // 直接用 Point 當類型名
Point p = {1, 2}; // 無需寫 struct
慣例:結構體配合 typedef 使用,類型名大寫(Point),變量名小寫(p)。
union聯合體成員共用同一塊內存,大小等於最大成員的大小。
union Data {
char c; // 1字節
int i; // 4字節
double d; // 8字節 → 聯合體大小為8字節
};
union Data data;
data.i = 0x12345678;
data.c = 0x78; // 修改了 data.i 的低位字節
int 為 4 個 char
union {
int i;
char bytes[4];
} converter;
converter.i = 0x12345678;
// converter.bytes[0] 為 0x78 (小端序)
// converter.bytes[3] 為 0x12
| 類型 | 關鍵字 | 核心特性 | 典型場景 |
|---|---|---|---|
| 枚舉 | enum | 整型常量別名,類型安全 | 狀態碼、選項集合 |
| 結構體 | struct | 異構數據聚合,獨立內存 | 實體建模、數據記錄 |
| 聯合體 | union | 同構內存共用,互斥存儲 | 位操作、省內存、硬件映射 |
| 類型別名 | typedef | 簡化聲明,隱藏實現細節 | API設計、跨平台類型抽象 |
熟練掌握構造類型,是編寫模塊化、可維護C代碼的關鍵一步。尤其要理解結構體指針操作、typedef 的類型抽象能力、聯合體的內存覆蓋語義。