自定义数据类型
看清 typedef 真相、结构体对齐逻辑、位域陷阱与联合体的内存复用边界
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
自定义数据类型
看清 typedef 真相、结构体对齐逻辑、位域陷阱与联合体的内存复用边界
声明结构类型以及定义结构
前面我们看到 C 允许自造数据类型,最常用的就是 struct。但很多初学者分不清:struct Student {...}; 只是描述新数据长什么样;struct Student s1; 才真正分配内存。
图纸只描述房子长什么样不占地;按图盖出的房子才真正占地、可住人
结构变量赋值及引用
假设你写好了 Student 类型,并定义了 s1、s2 两个学生变量。现在有三个问题:能不能直接把 s2 抄给 s1?怎么读出 s1 的某个字段?函数拿到学生指针时又怎么取字段?
原件和复印件内容相同,改任何一边都不会影响另一边
结构体嵌套和结构体数组
前面我们掌握了单个结构变量的赋值和引用。但现实中信息往往是层次化的——学生有出生日期、地址有省市区。怎么处理这种'套着套'或'排成队'的情况?
一行对应一个数组元素;格中的省/市/县对应嵌套的层
结构体指针
上页讲的结构体数组大小在编译期就固定了。运行时要动态创建结构体、或者把结构体高效传给函数时,就要靠结构体指针——它存的是地址,不是结构体本身。
门牌卡只记房间地址,按地址找到房间就能进入各成员
结构体与函数
上页说到结构体指针:传指针比传整个结构体轻量得多。这页专门讲结构体和函数打交道时的几种方式——参数怎么传、返回值怎么处理、以及怎么约束函数不乱改数据。
值传递像复印整本书借走,副本改坏不影响原书;指针传递像只告知书架编号让你自取,可直接动原书。
共用体类型
结构体里每个成员都有自己的房间,互不打扰。共用体反过来——所有成员挤在同一间房里,谁进来谁就把它占满。听起来奇怪,但它解决的是另一类问题。
几个人合租一套房,客厅同一时刻只能被一个人用;union 同一时刻只能让一个成员的值有意义
枚举类型
上页学了共用体——成员共享内存。还有一类问题:「变量的取值只能是有限个固定选项」,比如一周只有 7 天、性别只有 3 种。这种就该用枚举。
变量只能在周一到周日里选,每个名字背后对应 0~6 的数字
二级C考点解析之结构体定
上一页说到,基本类型装不下一个人、一本书的全部信息,所以才需要自定义类型。这一页看第一个、也是最常用的工具——结构体,看它怎么把多个不同类型的数据绑成一个整体。
体检表把姓名、身高、体重等栏目聚合成一份完整记录;结构体把多个不同类型的成员聚合成一个整体
二级C考点解析之结构体应
前面我们把结构体的零件全拆过一遍——定义、赋值、嵌套、指针、传参。现在要装回考卷了,应用层的考点其实就三类:怎么造、怎么访问、整体怎么搬。
姓名、年龄、电话是不同栏目,按栏目名取值,整张表可直接复印
本节要点
- ✓成员顺序与对齐规则共同决定结构体实际大小
- ✓`.`与`->`只是写法区别,底层访问同一片内存
- ✓共用体所有成员共享同一段存储,同一时刻仅一个值有效
- ✓枚举常量在编译期被替换为整型数字
- ✓结构体作为函数参数优先传指针,避免整块内存复制
课后思考
先合上书自己想一分钟,再点开答案对一对思路。
参考答案值得。结构体解决的是『逻辑上属于同一实体但类型不同的数据如何组织』的问题,没有它就只能用平行数组,索引极易出错。
参考答案看每条记录多大。若单条≤8字节,数组可行;超过就要考虑动态分配或压缩字段,避免栈溢出和内存浪费。
参考答案不是。结构体各成员占独立内存,地址叠加;共用体所有成员起始地址相同,大小由最大成员决定,本质是『内存复用』。一个是组合,一个是覆盖。