二、共用体类型 union
(一)定义
所有数据成员共用一段内存的数据类型
只占用一段内存,一次赋一个值
共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖
(二)共用体和结构体的区别
-
定义和声明的形式和成员引用的方法是一样的
-
结构体所有的成员拥有独立的空间
struct stu
{
char a;
short b;
int c;
}; // a b c成员有用独立的空间


-
共用体所有的成员共享同一份空间
union stu
{
char a;
short b;
int c;
}; // a b c成员共享同一份空间
(三)共用体所占内存大小
-
以最大的数据成员所占内存大小为准,也会存在内存对齐
union U {
char a;
short b;
int c;
};
printf("%d\n", sizeof(union U)); // 4

-
共用体是最后一次赋值有效(不严谨)
-
共用体虽然共有同一份空间,但是从空间读取的字节数是由成员自身类型决定
-
对上述代码来说,a能读取1字节,b能读取2字节,c能读取4字节
union data
{
char a;
short b;
int c;
};
void test05()
{
union data A;
printf("%d\n",sizeof(union data)); // 4
A.c = 0x01020304;
A.b = 0x0102;
A.a = 0x01;
printf("%#x\n", A.a+A.b+A.c); // 0x01020203
}

三、枚举类型 enum
(一)定义
-
把所有可能的取值都列举出来的一种数据类型,可以理解成取值范围有限的整型
-
在枚举值表中应列出所有可用值,也称为枚举元素
-
枚举变量仅能取枚举值所列元素
enum 枚举名
{
枚举值表
};
(二)枚举值
-
枚举值是常量,不能在程序中用赋值语句再对它赋值
1、枚举值用整型的方式处理
-
如果没有指定枚举元素的值,枚举值默认从0开始
-
可以在枚举类型声名时指定枚举元素的枚举值
-
如果指定了部分枚举元素的枚举值,在其之后没有指定枚举值的枚举元素默认在前一个枚举元素的基础上+1
enum Weekday { sun = 7, mon = 1, tue, wed, thu, fri, sat = 6 };
enum Weekday workday, weekend; // 这里在声明后定义了两个enum Weekday枚举类型的变量workday和weekend
enum Weekday { sun, mon, tue, wed, thu, fri, sat }workday, weekend; // 在声明时定义变量
2、枚举变量只能接受枚举类型数据
workday = (Weekday)2; // 强制转换类型,并赋值为2
(三)组成
-
enum是枚举类型的关键字
-
Weekday是枚举类型的类型名
-
sun,mon,tue,wed,thu,fri,sat是枚举元素(枚举成员),枚举值默认从0开始
-
workday、weekend是枚举类型变量
enum Weekday { sun = 7, mon = 1, tue, wed, thu, fri, sat = 6 };
enum Weekday workday,weekend; // 星期枚举类型变量workday、weekend
workday = wed;
printf("%d\n", workday); // 3
enum Weekday Weekend[2] = { sun, sat }; // 枚举数组
enum Weekday Workend[5] = { mon, tue, wed, thu, fri };
enum Weekday Today = wed;
switch (Today) // 枚举类型可以作为条件进行比较
{
case sun: printf("今天是星期天,可以玩游戏!\n"); break;
case mon: printf("今天是星期一,上班第一天!\n"); break;
case tue: printf("今天是星期二,上班继续!\n"); break;
case wed: printf("今天是星期三,上班中!\n"); break;
case thu: printf("今天是星期四,还在上班中!\n"); break;
case fri: printf("今天是星期五,摸鱼中!\n"); break;
case sat: printf("今天是星期六,可以睡懒觉!\n"); break;
}
-
游戏玩家的上下左右操作也可以使用枚举来完成
enum dir{ 上 = 'w', 下 = 's', 左 = 'a', 右 = 'd' }; // 方向枚举类型 范围内取值
enum dir PlayerDir; // 玩家移动的方向
while (1)
{
switch (PlayerDir = getchar())
{
case 上: printf("玩家向上移动!\n"); break;
case 下: printf("玩家向下移动!\n"); break;
case 左: printf("玩家向左移动!\n"); break;
case 右: printf("玩家向右移动!\n"); break;
}
}
4636

被折叠的 条评论
为什么被折叠?



