在C語言程式設計中,結構體(Struct)是實現複雜資料組織的核心機制。它允許我們將不同類型的資料封裝成一個邏輯整體,極大地提升了程式碼的可讀性與維護性。本文將系統講解結構體的三種定義方式、巢狀結構體設計、成員存取規則、初始化技巧,以及結構體數組的實際應用場景。
struct student {
int num; // 學號
char name[20]; // 姓名
char sex; // 性別
int age; // 年齡
float score; // 成績
}; // 注意:結尾必須加分號
struct student student1, student2; // 定義兩個結構體變數
struct student {
int num;
char name[20];
char sex;
int age;
float score;
} student1, student2; // 直接定義變數
struct {
int num;
char name[20];
char sex;
int age;
float score;
} student1, student2; // 無法復用此結構類型
核心概念:結構體是一種「聚合資料類型」,可視為一個整體。其成員可包含任意基本類型(int、char、float等),甚至其他結構體,形成巢狀結構。
以學生資訊為例,若需將「年齡」改為「出生日期」,可定義日期結構體並巢狀引用:
struct date {
int year;
int month;
int day;
};
struct student {
int num;
char name[20];
char sex;
struct date birthday; // 引用 date 類型
float score;
} student1, student2;
此時 student1.birthday 擁有 struct date 的所有屬性,可進一步存取 year、month、day。
student1.score = 89.6; // 存取分數
student1.birthday.year = 2000; // 存取巢狀成員
student1 = student2; // 整體賦值
student2.birthday = student1.birthday; // 部分賦值(巢狀成員)
此特性極大簡化了資料複製操作,無需逐個成員賦值。
支援定義時一次性賦值,須依成員宣告順序:
#include <stdio.h>
struct student {
int num;
char name[20];
char sex[2];
int age;
float score;
} student1 = {11301, "zhaoyuqiang", "F", 22, 450};
int main() {
printf("學號=%d\n姓名=%s\n", student1.num, student1.name);
printf("分數=%.1f\n", student1.score);
return 0;
}
struct student {
int num;
char name[20];
char sex;
int age;
float score;
} student1, stu[30]; // 單一變數 + 30元素陣列
每個陣列元素佔用相同大小的連續記憶體,包含完整的結構體成員:
| 索引 | Num | Name | Sex | Age | Score |
|---|---|---|---|---|---|
| stu[0] | 11301 | Zhangping | F | 56 | 89 |
| ... | ... | ... | ... | ... | ... |
| stu[29] | 11302 | Liheng | M | 12 | 56 |
#include <stdio.h>
struct student {
int num;
char name[20];
char sex;
int age;
float score;
};
struct student stu[4] = {
{11301, "zhaoyuqiang", 'F', 19, 458.6},
{11302, "lizheng", 'F', 18, 456.6},
{11305, "xuefeiyang", 'M', 20, 168.9},
{11308, "wangwu", 'M', 21, 320.5}
};
int main() {
int i;
float age_sum = 0, score_sum = 0;
for (i = 0; i < 4; i++) {
age_sum += stu[i].age;
score_sum += stu[i].score;
}
printf("平均年齡: %.1f\n", age_sum / 4);
printf("平均成績: %.1f\n", score_sum / 4);
return 0;
}
student),變數用有意義名稱掌握結構體是邁向C語言進階開發的關鍵一步,它不僅是資料組織工具,更是面向對象思維在C語言中的體現。實際專案中,合理設計結構體層級關係,能讓複雜業務邏輯變得清晰可控。