(1)联合体类型的声明
1.1联合体的声明
像结构体一样,联合体也是有一个或多个成员构成,这些成员可以是不同类型,联合体的关键字是union
但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用同一块内存空间,所以联合体也叫:共用体
1.2联合体的特点
① 这样一个联合体变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
②联合的成员是共用同一块内存空间的,即内存地址相同
③给联合体其中一个成员赋值,其他成员也跟着变化
1.3相同成员的结构体和联合体对比
我们在对比一下相同成员的结构体和联合体的内存布局情况
1.4联合体大小的计算
①联合体的大小至少是最大成员的大小
②当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
练习一:
sizeof(un1)=4
练习二:
1.最大成员大小:char arr[5],5个字节
2.全部成员对齐数取最大:max(1,4)=4
3.5不是4的整数倍,向上补齐到最近4的倍数:8
sizeof(un2)=8
练习三
最大成员8,最大对齐数8
sizeof(un3)=8
练习四
最大成员大小:8;最大对齐数max(4,2)=4;
8是4的倍数
sizeof(un4)=8
1.5联合体的应用
使用联合体是可以节省空间的,举例:
有三种商品:图书,杯子,衬衫,每一种商品都有:库存量,价格,商品类型和其他信息,我们要存储商品的信息
图书:书名,作者,页数
杯子:设计
衬衫:设计,可选颜色,可选尺寸
上述结构体设计简单,用起来方便,但是结构的设计中包含了所有礼品的各种属性,这样得到的结构体的大小就会偏大,比较浪费内存
所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体,这样就可以节省内存
![]()
1.5联合的一个练习
写一个程序判断当前机器是大端还是小端
2.枚举类型
2.1枚举类型的声明
枚举顾名思义就是一一列举,它把一组命名的整型常量打包在一起,用来表示固定的有限选项
把可能的值一一列举,enum是枚举的关键字
比如:一周的星期一到星期日是有限的7天,可以一一列举
以上定义的enum Day,enum Sex,enum Color都是枚举类型
2.2枚举常量默认规则
默认从0开始,依次加1
也可以手动指定值
枚举变量本质就是存一个整数,可以用int接收
2.3枚举的优点
1.可读性高,RED比写数字0更容易看懂
2.限定可选范围:只能在枚举列表里选,避免乱赋值
3.可以用switch做分支,非常适合状态位,标志位
用typedef简化枚举(工程常用),用枚举常量,给枚举变量赋值
易错点:
1.枚举成员是全局常量,不要和变量名重名,
2.枚举变量c 可以存任意int 数字,编译器不会强制校验只能取枚举里面的值
3.枚举不占内存!(枚举成员只是符号常量,编译阶段替换成整数,不分配内存)只有枚举变量才占用内存,VS:sizeof(枚举)=4字节
已完结