【落羽的落羽 C语言篇】自定义类型——联合体、枚举
文章目录
- 一、联合体
- 1. 联合体类型的声明
- 2. 联合体的特点
- 3. 联合体的大小
- 4. 联合体和结构体的对比
- 二、枚举
- 1. 枚举类型的声明
- 2. 枚举类型的优点
一、联合体
1. 联合体类型的声明
联合体像结构体一样,也是由一个或多个成员构成,这些成员可以是不同的类型。它和结构体的区别在于:编译器只为联合体的最大的成员分配足够的内存空间,所有成员共用这一块内存空间。所以,联合体有时也叫共用体。
它的声明形式是:
union name
{
member
member
......
};
道理和结构体极为相似,union是C语言中的一个关键字,name自起,member是成员。使用方法也和结构体很相似。
2. 联合体的特点
-
因为联合体的成员是共用一块内存空间的,所以给其中一个成员赋值,其他成员的值也会跟着变化。
-
一个联合体变量的地址和其中任意一个成员的地址都是相同的。
-
结构体成员同一时间只能使用一个。
3. 联合体的大小
- 一个联合体变量的大小至少是最大的成员的大小。
- 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍的地址偏移处。(关于对齐数,详见上期结构体)
4. 联合体和结构体的对比
struct s
{
char c1;
int i1;
};
union u
{
char c2;
int i2;
};
根据内存对齐的规则,可以看到:
联合体相比结构体的优点是:在一些特定情况下,使用联合体不影响成员数据的使用,而可以节省内存空间。
二、枚举
1. 枚举类型的声明
枚举,顾名思义,一一列举,把可能的结果一一列举。
比如,星期一到星期日,可以一一列举。
一年的12个月,也可以一一列举。
枚举的声明方式是:
enum name
{
member,
member,
......
//注意,member后是逗号,最后一个成员后不写逗号
};
enum是C语言中的一个关键字,member是枚举类型的可能取值,也叫枚举常量。
这些所有的可能取值都是有值的,从0开始,依次加1。或者自定义可能取值的值,未自定义的默认是上一个枚举常量的值加1。
有了枚举常量,以后的代码中出现同一个变量时,这个变量自动被替换成它的枚举常量。
比如:
enum day
{
Mon,//0
Tues,//1
Wed//2
};
//在下面的代码中,Mon就是0,以此类推
enum color
{
red=2,//2
blue,//3
green=5,//5
yellow//6
};
//在下面的代码中,red就是2,以此类推
2. 枚举类型的优点
我们也可以用#define
定义常量,为什么要有枚举的存在呢?
枚举独特的优点是:
- 增加代码的可读性和可维护性。
- 便于调试,预处理阶段会删除
#define
定义的符号。 - 使用方便,一次可以定义多个变量。
- 枚举常量遵循作用域规则,枚举声明在函数内的话,也就只能在函数内使用。
本篇完,感谢阅读