【C语言进阶篇】自定义结构体类型:联合体和枚举
🌈个人主页:开敲
🔥所属专栏:C语言
🌼文章目录🌼
1. 联合体
1.1 联合体类型的声明
1.2 联合体的特点
1.3 联合体大小的计算
2. 枚举
2.1 枚举类型的声明
2.2 枚举类型的优点
2.3 枚举类型的使用
1. 联合体
1.1 联合体类型的声明
与结构体类似,联合体也是由一个或者多个成员构成的,这些成员可以是不同的类型。唯一不同的是:编译器只为最大的成员开辟空间,联合体中剩余的成员共用这一块空间。因此,联合体也称为:共用体。
这里的大小为4,因为联合体内成员最大的就是 int 型,而剩余的 char c成员共用这块空间。
1.2 联合体与结构体对比
内存分配如下图:
1.3 联合体大小的计算
① 联合体的大小至少是最大成员的大小。
② 当最大成员的大小不是最大对齐数的整数倍时,就要内存对齐到最大对齐数的整数倍。
1.4 联合体的巧妙用法
在之前的文章中,我们判断一个机器是大小端的方法是:创建一个整型变量赋值为1,用一个char* 的指针指向这个变量的第一个字节的地址,判断是 0 还是 1 从而判断是大端存储还是小端存储
而在我们学习了联合体之后,就可以用一个非常巧妙的方法来判断机器的大小端:
这里的 c 是跟 i 存放在同一个空间的,而 char 类型只占一个字节,因此,c 保存在了 i 内存的第一个字节处,相当于 c 指向了 i 的第一个字节地址,因此,可以通过判断 c 的值来判断机器的大小端模式。
2. 枚举
枚举——顾名思义,就是一一列举,把可能的取值一一列举,和穷举不同的是,穷举就算有再多,只要能列举完就会列举,而枚举并不会列举太多。
生活中有许多枚举的例子,比如:
一周的星期一到星期日可以一一列举;
一年有十二个月份可以一一列举;
......
当我们想要表示这些数据的时候,就可以使用枚举。
2.1 枚举类型的声明
上面定义的 enum Day 、 enum Month 都是枚举类型,{}中的内容是枚举类型的可能取值,也叫枚举常量,这些常量都是默认有值的,从上至下从0依次递增:
enum Day//星期
{
Mon,//0
Tues,//1
Wed,//2
Thur,//3
Fir,//4
Sat,//5
Sun//6
};
enum Month//月份
{
Janu,//0
Febr,//1
Mar,//2
Apr,//3
May,//4
June,//5
July,//6
Aug,//7
Sep,//8
Oct,//8
Nove,//10
Dec//11
};
当然我们也可以在创建的时候赋初始值(这里需要注意的是,在C语言中可以对枚举常量赋值。但在C++中没法进行赋值操作,C++的类型检查更加严格,类型不相同无法进行赋值操作),当赋了初始值以后,剩余成员的默认值也会随之改变,比如:
2.2 枚举类型的优点
在我们之前的学习中,我们学习到了#define 来定义常量,既然#define 可以用来定义常量,为什么还要使用枚举呢?下面就是一些枚举的优点:
① 增加代码的可读性和可维护性
② #define定义的常量没有类型,而枚举中的常量带有类型,因此在使用枚举时更加严谨
③ 便于调试观察,#define定义的常量,在使用时会删除#define定义的符号,譬如:
④ 使用方便,一次可定义多个常量:
⑤ 枚举常量是遵守作用域规则的。,在函数内部声明的枚举只能在函数内部使用。
2.3 枚举类型的使用
创作不易,点个赞呗,谢谢啦~