二十一、自定义类型:联合和枚举
欢迎阅读这篇文章 目录1、联合体1.1联合体类型的声明1.2联合体的特点1.3相同成员的结构体和联合体对比1.4联合体大小的计算1.5联合体的应用2、枚举类型2.1枚举类型的声明2.2枚举类型的优点2.3枚举类型的使用1、联合体1.1联合体类型的声明像结构体一样联合体也是由一个或者多个成员构成的这些成员可以是不同的类型。联合体的关键字是union。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫共用体。给联合体其中⼀个成员赋值其他成员的值也跟着变化。#includestdio.h//联合类型的声明unionUn{inti;charc;};intmain(){//联合变量的定义unionUn u1{0};//计算联合变量的大小printf(%zu,sizeof(u1));//4return0;}上方代码中联合变量的大小是4下面来具体研究一下。1.2联合体的特点联合的成员是共用同一块内存空间的这样一个联合变量的大小至少是最大成员的大小因为联合⾄少得有能⼒保存最⼤的那个成员。我们分别打印联合变量的地址联合体两个成员的地址观察一下//打印地址观察#includestdio.hunionun{inti;charc;};intmain(){unionun u1{0};printf(%p\n,u1.i);printf(%p\n,u1.c);printf(%p\n,u1);return0;}我们发现输出的三个地址一样下面观察一下对结构体成员进行赋值#includestdio.h//赋值观察unionun{inti;charc;};intmain(){unionun u1{0};u1.i0x11223344;u1.c0x55;printf(%x,u1.i);return0;}我们仔细分析就可以画出un的内存布局图。1.3相同成员的结构体和联合体对比我们对比一下相同成员的结构体和联合体的内存布局情况structs{charc;//大小是1默认对齐数是8对齐数是1inti;//大小是4默认对齐数是8对齐数是4};unionun{charc;inti;};在相同成员的情况下联合比结构更省空间。1.4联合体大小的计算联合体大小至少是最大成员的大小当最大成员的大小不是最大对齐数的倍数的时候就要对齐到最大对齐数的倍数。1.5联合体的应用写一个程序判断当前机器是大端还是小端//利用联合体判断机器是大端还是小端intcheck(){unionun{inti;charc;}u1;u1.i1;returnu1.c;//取首地址1字节返回1说明是小端返回0说明是大端}intmain(){inticheck();if(i)printf(小端);elseprintf(大端);return0;}2、枚举类型2.1枚举类型的声明枚举的意思就是一一列举。比如现实生活中有一周的周一到周日是有限的7天可以一一列举月份有12个月可以一一列举三原色可以一一列举这些数据的表示就可以使用枚举enumday//星期{Mon,Tues,Wed,Thur,Fri,Sat,Sun};enumcolor//颜色{red,green,blue};以上定义的enum dayenum color都是枚举类型。{}中的内容是枚举类型的可能取值也叫枚举常量。这些可能取值都是有值的默认从0开始依次递增1当然在声明枚举类型的时候只有在声明的时候可以也可以赋初值。enumcolor//颜色{red2,green4,blue8};2.2枚举类型的优点我们可以使⽤#define定义常量为什么⾮要使⽤枚举枚举的优点增加代码的可读性和可维护性和#define定义的标识符⽐较枚举有类型检查更加严谨便于调试预处理阶段会删除#define定义的符号使⽤⽅便⼀次可以定义多个常量枚举常量是遵循作⽤域规则的枚举声明在函数内只能在函数内使⽤2.3枚举类型的使用//枚举的使用enumcolor//颜色{red2,green4,blue8};enumcolorc1blue;//用枚举常量给枚举变量赋值