联合体
联合体的特点是所有成员共用同一块内存空间。所以联合体也叫共用体
联合体类型的声明
union Un { int i; char ch; }; int main() { union Un p = { 0 }; //联合变量的定义 printf("%zd\n", sizeof(p)); //计算联合变量的大小 return 0; }
注:联合体也类似结构体,结构体中的struct必不可少,同理,联合体中的union必不可少
联合变量的大小
控制台输出:4
为什么呢?我们再来观察联合体中 i 和 ch 的地址
union Un { int i; char ch; }; int main() { union Un p = { 0 }; //联合变量的定义 printf("%zd\n", sizeof(p)); //计算联合变量的大小 printf("%p\n", &p.i); printf("%p\n", &p.ch); return 0; }
控制台输出:
代码结果解释
那还有疑问,为什么这两个的地址要这样做存放呢?
这得谈及我们上面👆说到的联合体的特点;
这里我们具体再说一下联合体的特点:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
联合体和结构体的对比
联合体的作用
最大作用就是可以节省空间
举个栗子:
价格:price ;类型:type ;大小:size ;标签:label ;颜色:colour
我们可以这样子用联合体:
struct study_set { //公共 int price; char type; //特殊 union { struct { char colour; //颜色 }pencil_book; //笔盒 struct { char label; //标签 }book; //书本 struct { int size; //大小 }book_shelf; //书架 }item; };
枚举类型
枚举 -- 把可能的取值一一列举
一个星期有七天--1,2...7;
一年有12个月份--1,2...12
例如一周的天数
注:枚举也像结构体,联合体一样有关键字,枚举的关键字是enum
#include<stdio.h> //一周的天数 enum Day { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; int main() { printf("%d\n", Mon); printf("%d\n", Tues); printf("%d\n", Wed); //... printf("\n"); printf("%d\n", Sun); return 0; }
来看看这段代码输出什么?
以上是编译器设置的最初始默认值,也可以自己设置
#include<stdio.h> //一周的天数 enum Day { Mon=1, Tues=9, Wed=10, Thur, Fri, Sat, Sun }; int main() { printf("%d\n", Mon); printf("%d\n", Tues); printf("%d\n", Wed); //... printf("\n"); printf("%d\n", Sun); return 0; }
控制台输出:1 9 10 14
枚举类型优点
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使用方便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使用