| 分類 | 示例 | 特點 |
| 基本類型 | int, float, char, double | 語言內置,不可拆分 |
| 構造類型 | 結構體、聯合體、枚舉、數組 | 由基本類型組合,可嵌套 |
結構體變量定義與使用
方式 1:先定義類型,再定義變量
struct Student stu1, stu2; // 關鍵字 struct 不可省略
方式 2:定義類型同時定義變量
struct Student {
char *name;
int num;
// ...
} stu1, stu2; // 變量名放在結尾
方式 3:匿名結構體(僅用於定義少量變量)
struct {
char *name;
int num;
} stu1, stu2; // 無標籤,後續無法復用類型
成員訪問:點運算符 (.)
結構體變量名.成員名
完整示例
#include <stdio.h>
int main() {
struct {
char *name;
int num;
int age;
char group;
float score;
} stu1;
// 逐個賦值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
// 讀取輸出
printf("%s的學號是%d,年齡%d,在%c組,成績%.1f!\n",
stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}
運行結果
Tom的學號是12,年齡18,在A組,成績136.5!
整體賦值(僅定義時可用)
struct Student stu1, stu2 = {"Tom", 12, 18, 'A', 136.5};
- 順序必須與成員聲明順序一致
- 使用過程中只能逐個成員賦值,不能整體賦值(同數組)
內存佈局與對齊
理論連續佈局
成員按聲明順序連續排列。上例理論大小:
指針(4/8) + int(4) + int(4) + char(1) + float(4) = 17/21 字節
實際內存對齊(編譯器插入填充字節)
為提高 CPU 訪問效率,編譯器會按對齊規則插入填充字節:
- 結構體起始地址對齊到最大成員對齊數
- 每個成員偏移量對齊到自身類型大小(或編譯器指定對齊數)
- 結構體總大小為最大對齊數的整數倍
上例在 32 位系統典型佈局:
name (指針 4B) : 偏移 0
num (int 4B) : 偏移 4
age (int 4B) : 偏移 8
group (char 1B): 偏移 12
【填充 3B】 : 偏移 13-15
score (float 4B): 偏移 16
總大小 = 20 字節(4 的倍數)
詳細對齊規則請參閱《C語言內存對齊,提高尋址效率》專題。
關鍵概念釐清
| 概念 | 說明 |
| 結構體類型 | 模板/圖紙,不佔用內存 |
| 結構體變量 | 實例/零件,佔用內存存儲實際數據 |
| sizeof(結構體類型) | 等同於 sizeof(結構體變量),返回實例大小 |
進階用法預告
- 結構體指針與
-> 運算符
- 結構體數組、嵌套結構體
- 結構體作為函數參數/返回值(傳值 vs 傳址)
- 位域、柔性數組成員
typedef 簡化聲明
- 上一篇文章: C 語言結構體陣列:管理同類資料群體的標準方式
- 下一篇文章: C 語言指標總結:核心概念與常見類型速查表
Copyright ©
程式碼之家 All Rights Reserved