前言
之前我们学习了自定义数据类型里的结构体,还顺带着学习了位段
今天,我们就来学习枚举和共用体,我们开始吧
枚举
枚举就是一一列举
枚举类型的定义
枚举类型的创建
enum Day { mon,//此处是逗号 tues, thur, };//;不能少
enum:是类型关键字
{}里的就是可能的取值,都是常量
第一个常量的值默认是0,之后挨个增加
初始值可以改变,当不改变时就认为是前一个常量的值加一
下面给出三个例子方便大家理解
1
enum Day { mon, tues, thur, }; int main() { enum Day d1 = mon; printf("%d %d %d\n", mon, tues, thur); return 0; }
运行结果:
2
enum Day { mon = 1, tues = 3, thur = 5, }; int main() { enum Day d1 = mon; printf("%d %d %d\n", mon, tues, thur); return 0; }
运行结果:
3
enum Day { mon, tues = 3, thur, }; int main() { enum Day d1 = mon; printf("%d %d %d\n", mon, tues, thur); return 0;
运行结果:
枚举类型的使用
enum Day { mon, tues, thur, }; int main() { enum Day d1 = mon; return 0; }
创建变量需要写上关键字,并且变量的值只能是定义中的某一个值
注意
不要给枚举常量赋值,这是错误的
enum Day d2 = 4;
枚举类型的大小
我们用一段代码来解释这个问题:
enum Day { mon, tues, thur, }; int main() { enum Day d1 = mon; printf("%zd\n", sizeof(d1)); return 0; }
运行结果:
原因
因为上文提到了,mon这些成员的值默认是整数,都是int类型
所以我们可以知道他们的大小都是4个byte
注意
枚举类型的值是不可改变的,是由编译器决定的,所以大小就是固定的4byte
枚举的优点
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
联合(共用体/联合体)
联合的定义
union Un { char c; int i; }; int main() { union Un u; return 0; }
union是联合关键字
联合的特点
先来看一段代码,下面代码的结果是什么
union Un { char c; int i; }; int main() { union Un u; printf("%zd\n", sizeof(u)); printf("%p\n", &u); printf("%p\n", &(u.i)); printf("%p\n", &(u.c)); return 0; }
运行结果:
能看出来,他们的地址是相同的,也就是说他们都从同一块空间开始存储、占用同一块空间,这就是共用体的名称来源
所以联合体至少是最大成员的大小,在上面这道题中,就是4
提示
因为成员都从同一块空间存储,所以不能同时使用
联合体的使用
引入
先看一道笔试题:
判断当前机器的大小端存储(字节存放顺序)
使用指针
int check_sys() { int a = 1; return *(char*)&a; } int main() { int ret = check_sys(); if (ret == 1) { printf("小\n"); } else { printf("大\n"); } return 0; }
使用联合体
int check_sys() { union Un { char c; int i; }u;//此处可以像结构体一样,创建一个全局的联合体变量 u.i = 1; return u.c;//返回的是第一个字节 } int main() { int ret = check_sys(); if (ret == 1) { printf("小\n"); } else { printf("大\n"); } return 0; }
联合体的大小
下面这段代码的运行结果是:
union Un { int a; char arr[5]; }; int main() { union Un u; printf("%zd\n", sizeof(u)); return 0; }
计算联合体大小的规则
联合体的大小至少是最大成员的大小(类似结构体)
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
数组的对齐数:用其中一个元素的大小来和默认值比较
由上可知,4+1+3 == 8,结果是8
结语
自定义数据类型的知识介绍到这里就结束了,感觉收获很多呢
之后我利用已经学会的知识来尝试去实现通讯录,我们下篇文章见~