C 語言結構體完整入門:定義、typedef、初始化三種方式與指標存取成員
1. 定義語法
// 方式一:標準定義
struct Teacher {
char name[64];
int age, id;
};
// 方式二:typedef 別名 (推薦)
typedef struct Teacher {
char name[64];
int age, id;
} Teacher; // 現在可直接用 Teacher 當型別
// 方式三:匿名結構體 + 變數 (罕用)
struct { char name[64]; int age; } t1, t2;
2. 初始化三種方式
// 1. 定義後賦值
Teacher t1;
t1.age = 30; strcpy(t1.name, "王老師");
// 2. 定義時初始化 (順序必須匹配)
Teacher t2 = {"李老師", 35, 102};
// 3. 指定成員初始化 (C99,順序任意、可跳過)
Teacher t3 = {.name = "張老師", .id = 103}; // age 自動為 0
3. 指標存取成員
Teacher t = {"A", 20, 1};
Teacher *p = &t;
// 兩種等價寫法
p->age = 21; // 箭頭運算子 (慣用)
(*p).age = 21; // 解參考後用點運算子
// 陣列指標
Teacher arr[3];
Teacher *pa = arr;
for (int i=0; i<3; ++i) {
printf("%s\n", pa[i].name); // 陣列下標
printf("%s\n", (pa+i)->name); // 指標算術
}
4. 結構體記憶體佈局
- 成員按宣告順序排列,位移由編譯器計算 (含對齊填充)。
sizeof(Teacher) ≥ 成員大小總和。
offsetof(Teacher, age) (stddef.h) 獲取位移。
5. 實務建議
- 慣用
typedef 簡化型別名稱。
- 大型結構體傳遞函數用指標
void func(const Teacher *t) 避免拷貝開銷。
- 字串成員用固定陣列
char name[64] 簡單,或 char *name 配合動態分配靈活。