结构体:
匿名结构体只能使用一次;
数据结构:描述的是数据在内存中的存储和组织结构;顺序表,链表;
结构体自引用:节点数据域和指针域;
结构体内存对齐;对齐规则:
1.结构体第一个成员对齐到和结构体变量起始位置偏移量是0的位置;
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;
对齐数:编译器默认的一个对齐数 与该成员变量大小的较小值;vs中默认的是8,
3.结构体的总大小为最大对齐数(结构的每个成员都有一个对齐数,所有对齐数中最大的)的整数倍;
4.如果嵌套结构体,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小,就是所有最大对齐数的整数倍;
宏 offsetof 可以计算结构体成员相较于起始位置的偏移量;
为什么会存在内存对齐:1.平台原因:不是所有的平台都能访问任意地址的任意数据,某些硬件平台只能在某些地址处取某些特定类型数据;
2.性能原因;节省时间,对齐的内存一次只用访问一次;
位段从左到右依次使用;剩余空间不够,下一个,位的大小不能超过成员大小; 从右向左还是从左向右不确定,存在跨平台性的问题;
不能对位段的成员使用&操作符;创造一个临时变量使用scanf对这个变量赋值再给位段变量;
栈内地址从高到低,一个对象内从低到高;
联合体和枚举:
联合体(union)类型声明:与结合体相似,有一个或多个成员组成;这些成员可以是不同类型;但是编译器只为最大的成员分配足够的内存空间,联合体的特点是成员公用同一块内存空间,也叫共用体; 给联合体一个成员赋值时,其他成员的也在变;
联合体的大小至少是最大成员的大小;也存在对齐,对齐规则:最大对齐数的整数倍;
枚举:顾名思义一一列举; 把可能的情况列举出来;
关键字 enum 用逗号隔开每个元素之间; 枚举的可能取值是常量;初始值可以修改;枚举类型的变量只能用枚举常量;
枚举的优点: 1.增加代码的可读性和可维护性;
2.和#define定义的标识符比较枚举有类型检查,更加严谨;
3.便于调试,预处理阶段会删除#define定义的符号;直接替换成数字;
4.使用方便,一次可以定义多个常量;
5.枚举常量遵循作用域规则的,枚举声明在函数内,只能在函数中使用;#define定义是全局范围没有作用域的;
枚举变量可以在switch语句中使用;