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

iOS 開發基礎:C 語言構造類型詳解(結構體、枚舉、共用體)

     編輯:關於C語言

iOS 開發基礎:C 語言構造類型詳解(結構體、枚舉、共用體)

C 語言構造類型包括:陣列、結構體、枚舉、共用體。陣列已在前文詳述,本文重點講解後三者,這是理解 Objective-C 對象模型、Core Foundation 數據結構的基礎。

一、結構體

1. 定義與初始化


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 = {...}; // 編譯錯誤

2. 內存佈局與對齊

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 (指針)080
age (int)840
birthday (Date)16124 (前填充)
height (float)2840
總計32

3. 結構體陣列、指針、函數傳遞


// 陣列
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中見

五、最佳實踐

  1. 結構體成員按大小遞減排序可減少填充(大→小→大)
  2. 2. 公開 API 用 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 代碼的前提。

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