目录
“1.联合体的特点:”
联合体与结构体一样,成员可以是不同类型的变量。各成员变量共用同一块内存空间,这样一个联合体的大小至少是它里面最大变量的大小。
正是因为联合体成员变量共同占用同一块内存空间,所以给其中一个成员变量赋值,其他成员变量的值也会发生生改变。因此联合体也叫做”共同体“
1.举例验证联合体的大小至少为最大变量的大小:
这里占用四个字节,说明union Un un的大小为最大成员变量的大小。
2.验证联合体的中成员变量占用同一块空间:
法一:取联合体内各成员变量的地址是否一致。若一致则可以验证占用同一块空间。
法二:采用赋值的方法
详解图:
这里原本i应是的十六进制打印应是11223344,但打印为11223355,因为vs为小端储存,c 与 i占同一块空间,所以低字节的内容44被赋值为55
"2.联合体的内对齐”
不是说联合体大小至少是最大成员变量的大小吗?对,但那也只是至少,并不准确。
其实联合体内部成员也有内对齐规则,和之前讲过的结构体内对齐相似。
规则:
1.联合体的大小至少是最大成员变量的大小
2.最大成员变量大小不是最大对齐数的整数倍时,就要对齐到最大整数倍
3.最大对齐数为最大成员变量的类型大小
理解练习:
大家想一下,联合体un1,和un2的大小,
对于un1,最大成员变量为 char c[5] 占5个字节,
un2,最大成员 short c[7]占14字节,
难道它们大小分别是5字节 和14字节吗?
当然不是,这里要成员变量要内对齐
分析:
对于un1:c[5] 5字节,i占4字节。
最大成员大小5字节,最大对齐数为4,从偏移量为零处对齐5字节,所以对齐到4,一共占5个字节不是最大对齐数的整数倍,所以要舍弃三个字节对齐到偏移量为7处,一共占有8字节为最大对齐数4的整数倍。
解析图:
分析:
对于un2也是一样,最大对齐数为4,而short c[7]为14个字节,所以从0偏移量处对齐,对齐到偏移量为13处,一共占14字节,不是4的倍数,要舍弃两个字节对齐到15,这样一共16个字节正好为4的倍数。
总结:并不是所有联合体都要内对齐,使用联合体可以省略大量空间。
“3.枚举类型”、
1.枚举类型的声明:
枚举类型顾名思义就是一一列举,把可能的值一一列举
比如:生活中我们去购物可能会把需要的物品一一列举出来。
洗发水,牙刷,纸巾等一一列举
一个周的七天也可以一一列举
那么这些数据的表示就可以列举了,
以上定义的 enum Sex,enum Day都是枚举类型。
{}中的是枚举类型可能的取值,叫做枚举常量。
这些枚举常量都是有值的,默认从取值0开始,一次递增加一,当然也可以在定义枚举类型时,给它们赋初始值。
2.枚举类型的使用:
在给枚举变量赋值时应使用枚举常量。那能不能用常量给枚举变量赋值呢,
在C语言中是可以的,但在C++里是不行的,C++的检查性较为严格。
3.枚举类型的优点:
明明可以使用#define定义常量,为啥偏偏使用枚举?
枚举类型可以增加代码的维护性,可阅读性。
枚举类型定义的变量有类型检查,相对#define更加严谨。
更加方便,一次可以定义多个常量。
枚举类型有作用域规则,如果定义在函数内部,则只能在函数内部使用。