結構體(struct)是 C 語言實現複雜數據結構的基石。STM32 固件庫大量使用結構體封裝寄存器組,掌握結構體語法是嵌入式開發的必修課。本文系統梳理定義、變量聲明、初始化、成員訪問、指針操作、嵌套與枚舉等核心知識點。
struct 結構體名 {
成員類型 成員名;
...
} 變量名列表; // 可選,定義類型同時聲明變量
struct Date {
int month;
int day;
int year;
};
struct Student {
int num;
char name[20];
char sex;
int age;
struct Date birthday; // 成員可為另一結構體類型
};
注意:定義類型本身不分配記憶體,只是建立模板。
struct Student stu1, stu2;struct Student { ... } stu1, stu2;struct { int num; char name[20]; } stu1, stu2;struct Student stu = {10001, "Li", 'M', 20, {2000, 9, 1}};
struct Student stu = {.num = 10001, .name = "Li", .birthday = {.year = 2000}};
stu.num = 10010; stu.birthday.year = 2001;stu1 = stu2;(逐成員拷貝,含陣列)sum = stu1.score + stu2.score;struct Student *p = &stu; p->num = 10010; // 等價於 (*p).num p->birthday.year = 2001;
箭頭運算子 -> 是 (*p).member 的語法糖,極大簡化指針操作。
struct RankRecord {
int no;
char *name;
int score;
} records[3] = {
{1, "Jack", 5000},
{2, "Jim", 500},
{3, "Jake", 300}
};
for (int i = 0; i < 3; i++)
printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score);
enum Sex { Male, Female, Unknown }; // 預設 0, 1, 2
enum Season { Spring = 1, Summer, Autumn, Winter }; // 可指定起始值
enum Season s = Spring; // 實際為 int 類型,C 語言不強制類型檢查
枚舉本質是 int 常量,主要提升代碼可讀性與 IDE 補全體驗。
#includestruct Date { int year, month, day; }; struct Student { long num; char name[20]; char sex; char addr[20]; struct Date birthday; }; int main() { struct Student a = {10001, "Li", 'M', "Beijing", {2000, 9, 1}}; printf("No.: %ld\nName: %s\nSex: %c\nAddress: %s\nBirthday: %d-%02d-%02d\n", a.num, a.name, a.sex, a.addr, a.birthday.year, a.birthday.month, a.birthday.day); return 0; }
輸出:
No.: 10001 Name: Li Sex: M Address: Beijing Birthday: 2000-09-01
掌握結構體,即掌握了 C 語言組織複雜數據的核心能力,為嵌入式固件庫、數據結構實現、協議解析打下堅實基礎。