自定义类型:联合体和枚举

目录

“1.联合体的特点:”

"2.联合体的内对齐”

“3.枚举类型”、


“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更加严谨。

更加方便,一次可以定义多个常量。

枚举类型有作用域规则,如果定义在函数内部,则只能在函数内部使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值