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

C 語言結構體入門:從定義到嵌套的完整指南

     編輯:關於C語言

C 語言結構體入門:從定義到嵌套的完整指南

結構體(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; // 成員可為另一結構體類型
};

注意:定義類型本身不分配記憶體,只是建立模板。

三種變量聲明方式

  1. 先定義類型,再聲明變量
    struct Student stu1, stu2;
  2. 定義類型同時聲明
    struct Student { ... } stu1, stu2;
  3. 匿名結構體直接聲明(無法復用類型)
    struct { int num; char name[20]; } stu1, stu2;

結構體變量初始化

完全初始化(按成員順序)

struct Student stu = {10001, "Li", 'M', 20, {2000, 9, 1}};

指定成員初始化(C99 指定初始化器)

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 補全體驗。

完整範例程式

#include 

struct 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 語言組織複雜數據的核心能力,為嵌入式固件庫、數據結構實現、協議解析打下堅實基礎。

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