C 語言構造類型包括:陣列、結構體、枚舉、共用體。陣列已在前文詳述,本文重點講解後三者,這是理解 Objective-C 對象模型、Core Foundation 數據結構的基礎。
struct Date {
int year;
int month;
int day;
};
struct Person {
char *name;
int age;
struct Date birthday; // 嵌套結構體
float height;
};
// 初始化:順序對應成員,嵌套用大括號
struct Person p = {"Kenshin", 28, {1986, 8, 8}, 1.72f};
// 錯誤寫法:struct Person p; p = {...}; // 編譯錯誤
64位系統下測試:
sizeof(struct Date) // 12 (4+4+4)
sizeof(struct Person) // 32 而非 28!
原因:內存對齊。MacOS 默認對齊參數 8 字節。Date 佔 12 字節,偏移量 12 非 8 的倍數,編譯器在 height 前填充 4 字節,使 Date 起始地址對齊到 16(8的倍數)。
| 成員 | 偏移 | 大小 | 填充 |
|---|---|---|---|
| name (指針) | 0 | 8 | 0 |
| age (int) | 8 | 4 | 0 |
| birthday (Date) | 16 | 12 | 4 (前填充) |
| height (float) | 28 | 4 | 0 |
| 總計 | 32 |
// 陣列
struct Person persons[3] = { ... };
persons[i].name // 訪問
// 指針
struct Person *ptr = &person;
ptr->name // 等價於 (*ptr).name
// 函數參數:值傳遞(複製整個結構體)
void change(struct Person p) { p.height = 1.80f; } // 不影響原值
// 若需修改,傳指針
void change_ptr(struct Person *p) { p->height = 1.80f; }
enum Season {
Spring, // 0
Summer, // 1
Autumn, // 2
Winter // 3
};
// 使用
enum Season s = Summer; // 等價於 1
if (s == Autumn) ...
for (s = Spring; s <= Winter; s++) printf("%d ", s); // 0 1 2 3
// 手動指定值
enum ErrorCode {
OK = 0,
ERR_IO = 100,
ERR_MEM = 200,
ERR_NET // 201
};
本質:枚舉常量是編譯期常量整數,可隱式轉換為 int。OC 中常用 NS_ENUM、NS_OPTIONS 宏增強類型安全。
union Type {
char a; // 1 字節
short int b; // 2 字節
int c; // 4 字節
};
union Type t;
t.c = 65796; // 0x00010104
// 此時所有成員共用同一塊內存(低地址開始)
// t.a = 0x04 = 4
// t.b = 0x0104 = 260
// t.c = 0x00010104 = 65796
sizeof(union Type) // 4(最大成員大小)
地址: base base+1 base+2 base+3 t.c: 04 01 01 00 (65796) t.b: 04 01 (260) t.a: 04 (4)
賦值 t.c 後,低位字節覆蓋 t.a、t.b。讀取較小成員時,只取對應位寬的低位數據。
| 特性 | 結構體 | 枚舉 | 共用體 |
|---|---|---|---|
| 內存 | 成員疊加(含對齊填充) | 無(編譯期常量) | 最大成員大小,共用空間 |
| 同時有效成員 | 所有 | 單一值 | 僅一個 |
| 典型用途 | 聚合異構數據 | 狀態機、常量集合 | 互斥字段、硬件映射 |
| OC對應 | 類/結構體 | NS_ENUM/NS_OPTIONS | 少用,Core Foundation中見 |
typedef struct {...} TypeName; 隱藏 struct 關鍵字
3. 枚舉用於狀態、錯誤碼、選項掩碼,避免魔術數字
4. 共用體讀寫不同成員屬未定義行為(C標準),但在主流編譯器(GCC/Clang/MSVC)上行為一致,嵌入式/系統編程常用
5. 位域 struct { unsigned a:3; unsigned b:5; } 可精確控制位佈局,替代部分共用體用途
構造類型是 C 語言表達複雜數據模型的核心工具。iOS 開發中,CGRect、CGPoint、UIEdgeInsets 皆為結構體;UIViewAnimationOptions 為選項枚舉;深度理解它們的內存語義,是寫出高性能、無 Bug 代碼的前提。