文章目录
- 前言
- 一、枚举类型
- 1.1 枚举类型的定义
- 1.2 枚举类型的使用
- 1.3 枚举的优点
- 二、联合体类型
- 2.1 联合体类型的定义
- 2.2 联合体类型的特点
- 2.3 联合体大小的计算
- 总结
前言
本篇文章介绍c语言中的枚举类型和联合体类型
一、枚举类型
1.1 枚举类型的定义
枚举类型和结构体类型相似,都是一种自定义类型。
定义枚举类型的关键字:enum
枚举类型的定义格式
enum 枚举名
{
枚举元素1,
枚举元素2,
...
};
例如,定义一个星期作为枚举类型
enum WEEK
{
Mon,
Tues,
Wed,
Thus,
Fri,
Sat,
Sun
};
枚举类型的第一个成员的取值默认为0,依次往后递增1,
输出枚举WEEK每个成员的值
修改枚举类型成员的默认值
enum WEEK
{
Mon = 1, //修改默认值为1
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
输出修改后枚举WEEK每个成员的值
1.2 枚举类型的使用
把一个整型值赋值为枚举类型变量
int a = 1;
enum WEEK day;
day = (enum WEEK)a; //类型转换
1.3 枚举的优点
- 增加代码的可读性和可维护性
- 与#define定义的标识符相比,枚举有类型检查,更加严谨
- 防止命名污染
- 便于调试
- 使用方便,一次可以定义多个常量
二、联合体类型
2.1 联合体类型的定义
联合体类型也是一种自定义类型
定义联合体类型的关键字:union
联合体类型定义的格式
union 联合体名
{
类型1 成员名;
类型2 成员名;
...
};
例如,定义一个联合体类型Un
union Un
{
int i;
char c;
};
联合体类型与结构体类型,枚举类型相似,也可以定义匿名联合体,例如
//定义一个匿名联合体
//定义匿名联合体时,和匿名结构体类型,必须同时定义匿名联合体变量
//my_union就是匿名联合体类型变量
union
{
int i;
char c;
}my_union;
2.2 联合体类型的特点
联合体的成员共用一块内存空间,因此也称联合体为共用体。
定义一个联合体
union Un
{
int i;
char c;
};
输出联合体Un的大小
输出联合体成员的地址
由输出结果可知,联合体u的成员i的地址和成员c的地址相同,说明两个成员指向同一块空间的起始位置,共用一块空间。
联合体u的内存情况如下
练习:使用联合体判断大小端
代码实现
int check_sys()
{
union //定义匿名联合体
{
int i;
char c;
}uu;
uu.i = 1;
//1的16进制形式 0x00000001
//低地址->高地址(32位机器)
//大端字节序 00 00 00 01
//小端字节序 01 00 00 00
//uu.c = 0 则为大端字节序
//uu.c = 1 则为小端字节序
return uu.c;
}
输出结果
2.3 联合体大小的计算
- 当联合体的最大成员是最大对齐数的整数倍,则联合体大小等于最大成员的大小
union Un
{
int i;
char c;
};
联合体Un的最大成员为4个字节,联合体的最大对齐数为4,那么i的大小即为联合体的大小
- 当联合体的最大成员不是最大对齐数的整数倍时,则联合体大小需对齐到最大对齐数的整数倍
union Un_2
{
char str[5];
int i;
};
分析联合体大小:
联合体成员 char str[5],大小为5个字节
当成员为数组时,数组的对齐数为元素类型的大小,vs默认对齐数为8
则str的对齐数为1
联合体成员int i ,大小为4个字节 ,vs默认对齐数为8
则i的对齐数4
联合体的最大对齐数为4
联合体的最大成员为5个字节,不是最大对齐数的整数倍
则联合体大小对齐到8个字节
输出联合体大小:
总结
本篇文章首先介绍c语言的枚举类型定义以及枚举类型的使用;最后介绍联合体类型的定义、联合体的特点以及如何计算联合体的大小。