1、联合体类型的声明
2、联合体的特点
3、联合体大小的计算
4、枚举类型的声明
5、枚举类型的优点
6、枚举类型的使用
联合体类型的声明
像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同的类型。联合体的关键词是union,但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间,所以联合体也叫:共用体。
给联合体其中一个成员赋值,其他成员的值也跟着变化
union U
{
char c;
int i;
};
int main()
{
union U u = { 0 };
printf("&u=%p\n", &u);
printf("&u.i=%p\n", &(u.i));
pritf("&u.c=%p\n", &(u.c));
}
这一串代码打印出来的地址是一样的
联合体的特点
联合体的成员是共用同一块内存空间的,这样一个联合体变量的大小(因为联合体至少得有能力保存最大的那个成员)
联合体大小的计算
联合体的大小至少是最大成员的大小
当最大成员的大小不是最大的对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
下面这两个例子可以很好的说明:
union U
{
char arrr5; //5
int n; //4
};
int main()
{
printf("%zu\n", sizeof(union U));
//打印结果为 8
return 0;
}
union U
{
short arrr7; // 14
int n; //4
};
int main()
{
printf("%zu\n", sizeof(union U));
//打印结果为 16
return 0;
}
使用联合体是可以节省空间的;
因为很多时候:我们只需要用其中一个变量,不需要同时用!
比如:
- 要么存整数
- 要么存字符
- 要么存浮点数
不同时用 → 共用空间 → 省空间!
内存空间:[ ][ ][ ][ ] 一共 4 字节
int a 占满这 4 字节
char b 只用第 1 字节
float c 占满这 4 字节
✅ 同一时间只能用一个✅ 放了 a 就不能放 b✅ 放了 b 就会覆盖 a
最直观对比
- 结构体:各用各的 → 空间大
- 联合体 :共用空间 → 空间小 = 最大成员大小
枚举类型的优点
我们可以使用#define定义常量,为什么还需要枚举:
枚举的优点:
1、增加代码的可读性和可维护性
2、和#define定义的标识符比较枚举有类型检查,更加严谨
3、便于调试,预处理阶段会删除#define定义的符号
4、使用方便,一次可以定义多个常量
5、枚举常量是遵循作用域规则的,枚举声明在函数内部,只能在函数内使用
// 定义枚举:一周的星期
// 枚举的本质:给固定的整数 起 有意义的名字
enum Week
{
// 特点1:自动赋值,默认从 0 开始,依次 +1
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
};
int main()
{
// 定义枚举变量
enum Week today = FRIDAY;
printf("今天是星期:%d\n", today);
// 输出:4 (因为FRIDAY自动赋值为4)
return 0;
}