结构体(Structures)

想象你有一张名片。姓名、电话、邮箱打包在一张卡片上。你不需要拿三张纸条——一张写名字,一张写电话,一张写邮箱——递出去时还得担心会不会少了一张。结构体也是一样:它把不同类型的数据打包成一个整体,贴上字段名,统一管理。

什么是结构体

C 语言的基本变量只能装一个值,数组只能装同一种类型。但现实世界的数据往往是复合的:一个「学生」既有字符串(姓名)、又有整数(年龄)、还有浮点数(成绩)。结构体(struct)就是为这种场景设计的——它是 C 语言中能把不同类型数据组合成有意义的整体的方式。

// 单个变量只能装一个值
int age = 20;
// 数组只能装同一种类型
int scores[5];
// 但一个"学生"既有字符串、又有整数、还有浮点数!

结构体把多个变量捆成一个实体,每个变量有字段名,通过 . 运算符访问成员。没有结构体之前,管理 100 个学生的信息要同时维护三个数组——姓名、年龄、成绩各一个。删除一个学生,三个数组都要改,稍不留神就错位。有了结构体之后,学生是一个「实体」。删除就是删一份,传递就是传一份,代码的意图变得清晰。

struct Student {
    char name[32];
    int32_t age;
    float score;
};
// 一个学生 = 一份完整档案,不是三个散落在各处的抽屉

C 的 struct 和 Python 的 class / dict 不同——它只有数据,没有方法,没有继承,没有动态属性。但这也是它的优势:内存布局紧凑,编译期类型安全,运行时性能可预测。结构体在系统编程、嵌入式开发、网络协议解析中随处可见。

为什么需要多个章节

结构体看似简单,但涉及的细节很多:定义语法有三种写法,初始化有顺序和指定两种方式,内存中有 padding 和对齐规则,传参时值传递和指针传递的行为完全不同。把这些内容放在一个章节里会太臃肿,所以拆成了五个子章节,各自聚焦一个方面。

如果你是第一次接触结构体,按下面的顺序阅读就好:

章节导览

  • 结构体基础 — 三种定义方式、初始化(顺序/指定初始化)、. 成员访问、结构体数组、浅拷贝、C vs Python 对比、常见错误
  • 嵌套结构体 — 结构体里面套结构体、链式访问(outer.inner.field)、多层次初始化、拷贝行为、C11 匿名嵌套
  • 结构体内存布局 — padding 与内存对齐、sizeof 真实大小、字段重排、__attribute__((packed))、位域、offsetof、嵌套结构体 layout、序列化
  • 结构体与函数 — 传值与传指针、-> 运算符、const 指针、返回结构体、RVO 优化

继续学习

方向链接
上一章 →类型别名(typedef) — 用 typedef 简化结构体声明
下一章 →结构体基础 — 从定义和初始化开始