C语言---08自定义数据类---02共用体union与枚举enum

二、共用体类型 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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盾山狂热粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值