目录
1. 结构体类型
内置类型:char、int、short、float
自定义类型:结构体类型、枚举类型、联合体类型
结构体类型:
创建结构体类型:
2. 匿名结构体类型
省略了结构体标签(名字),那么需要在后面创建结构体变量sa,否则以后没法使用这个结构体
3. 结构体的自引用
这样写法是错误的,因为无法计算出Node的大小 。
修改一下:
这样是可以的,因为指针的大小是 4/8 ,可以计算出Node的大小
4. 结构体的 typedef
将 struct Node 重新定义为 Node
此时,Node 是类型名字,不是定义的全局变量
5. 结构体类型的初始化
6. 结构体的内存对齐
1. 结构体成员的对齐数:取默认的对齐数和这个成员的较小值
2. 结构体的总大小:最大对齐数的整数倍
3. 结构体嵌套的时候:
- 对齐数是自己内部成员最大对齐数的整数倍
- 总大小是自己内部最大对齐数和外部最大对齐数的较大值的整数倍处
练习:
答案:16
7. 内存对齐的原因
例如:
- 32位机器:32根地址线、32根数据线
- 那么读c就会读4个字节,只需要读取一次
- 但是读a的时候,就需要读取两次拼接起来
- 但是浪费掉char c后面的空间的话,读取int a就只需要读取一次
- 结构体内存的对齐,就是拿空间换取时间
8. 修改默认对齐数
- #pragma pack(4) // 设置默认对齐数为4
- #pragma pack() // 取消设置的默认对其数
9. offset 取偏移量
offset(抵消) 可以求出结构体偏移量
需要头文件 stddef.h
第一个参数:结构体类型名
第二个参数:要求取的成员变量
10. 结构体传参
推荐结构体 传址 调用,防止内存消耗过大
为了防止传地址被改变,可以形参加个 const