1.枚举类型
1枚举类型的声明
枚举顾名思义就是一一列举。
把可能的取值一一列举。
比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
月份有12个月,也可以一一列举
三原色,也是可以一一列举
这些数据的表示就可以使用枚举了。
enum Day//星期
{Mon,Tues,Thur,Fri,Sat,Sun
};
enum Sex//性别
{MALE,FEMALE,SECRET
};
像上面的enum Day和enumSex都是枚举类型
但是枚举类型成员后面加的都是,而不是;
{}中的值是枚举可能的取值,也叫枚举常量
枚举常量是常量是不可被修改的
这些可能的取值都是有值的,默认从0开始,依次递增1
当然啦,在声明枚举类型的时候也可以赋初值
enum Day//星期
{Mon,Tues,Thur=12,Fri,Sat,Sun
};
比如像这个,Mon代表0 Tues代表1 Thur代表12,Fri代表13,Sat代表14,Sun代表15
2.枚举类型的优点
为什么使用枚举?
我们可以使用#define定义常量,为什么非要使用枚举?
枚举的优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨。
3.便于调试,预处理阶段会删除#define定义的符号
(这个在后面预编译章节会学习)
4.使用方便,一次可以定义多个常量
5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
比如我们只想让这个枚举在函数内部使用,出了函数外就无法使用,那这个时候#define就无法实现,因为它是在预处理阶段编译前就替换掉的,是全局的
当然了,前面说过枚举是常量,也就意味着,我们在给予初始值后就不能在进行赋值了
C的编译器不严格可以通过,但是C++编译器就比较严格了,就会报错。
2.联合体
联合体类型的声明
像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
给联合体其中一个成员赋值,其他成员的值也跟着变化。
我们直接上代码更好理解
我们可以发现,联合体成员是公用一块空间的,因此我们无法同时使用联合体的两个成员
,同时当我们改变联合体一个成员的值的同时,也有可能对另一个成员的值产生影响,当然联合体的内存大小未必是最大成员的大小
这就涉及到联合体的内存分配规则了
联合的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
我们直接来上个例子
这个地方联合体成员最大的是char a [6]也就是6个字节大小,但是它相当于6个char类型的变量也就是6个字节的大小,默认对齐数和char类型相同,都是1,
因此这个联合体的最大对齐数所数是int b的4,
但是最大成员大小是char [6]大小是6个字节大小,不是最大对齐数4的整数倍,
因此要再空两个字节的空间,最后这个联合体的内存大小是8,联合体大部分时候会节省内存,但也不是绝对,有时候也会造成浪费
联合体成员一般放不会同时使用的数据,比如我要存放我早中晚吃了什么的数据,我可以把热干面和烧烤同时存到联合体里面,因为我早上不肯能吃烧烤,晚餐不可能吃热干面,不会同时用到。
3.最后再来一个题
我们前面学过了判断大小端的方了
那我们学了联合体后右有了一种新的判断大小端的方法
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
union Un
{char a ;int b;
};
int main(void)
{union Un un = { 0 };un.b = 1;if (un.a == 1){printf("小端");}elseprintf("大端");return 0;
}
我们先把b=1存放到联合体里面,这联合体大小是4,具体计算方法看上文
下面均是16进制表示,一个方框代表一个字节空间
大端存储
00 | 00 | 00 | 01 |
小端存储
01 | 00 | 00 | 00 |
但是当我们拿a的时候都是从 左边开始,如果拿出来的是01那就是小端存储,如果拿出来的是00
那就是大端存储。
以上就是本章全部内容。