上篇文章介绍了结构体相关的内容,大家可以点击链接进行浏览:c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)-CSDN博客
各种源码大家可以去我的gitee主页进行查找:唔姆 (Nerowlp) - Gitee.com
今天要介绍的是:枚举与联合的相关内容
目录
一.枚举
1.枚举类型的定义
2.枚举的优点
3.枚举的使用
二.联合(共用体)
1.联合类型的定义
2.联合的特点
应用:判断当前计算机的大小端存储
3.联合大小的计算
一.枚举
- 枚举顾名思义就是一一列举
- 把可能的取值一一列举
1.枚举类型的定义
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
上述代码定义的 enum Sex , enum Color 都是枚举类型。{ } 中的内容是枚举类型的可能取值,也叫 枚举常量
这些可能取值都是有值的,默认从 0 开始,一次递增 1 ,当然在定义的时候也可以赋初值
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
默认值便是从零开始:
也可以自己进行主动赋值:
大家也可以猜一下这段代码输出什么:
enum Sex
{
MALE,
FEMALE=8,
SECRET
};
int main()
{
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
答案揭晓:
2.枚举的优点
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
3.枚举的使用
enum Color//颜色
{
RED=3,
GREEN=2,
BLUE=4
};
enum Color cl = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异
二.联合(共用体)
1.联合类型的定义
联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
union A //定义一个共用体
{
char a;
int b;
};
int main()
{
union A a; //创建一个共用体变量
printf("%p\n", &a);
printf("%p\n", &(a.a));
printf("%p\n", &(a.b));
return 0;
}
可以看到三个地址是一样的:
2.联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小, 至少是最大成员的大小 (因为联合至少得有能力保存最大的那个成员)
应用:判断当前计算机的大小端存储
union A //定义一个共用体
{
char a;
int b;
};
int judge()
{
union A u;
u.b = 1;
return u.a;
}
int main()
{
int a = judge();
if (a == 1)
{
printf("是小端");
}
else
{
printf("是大端");
}
return 0;
}
众所周知vs2019 是小端储存:
3.联合大小的计算
- 联合的大小至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
union U1
{
char arr[5]; //5个字节 对齐数是1
int a; //4个字节 对齐数是4
};
int main()
{
printf("%d", sizeof(union U1));//如果只是最大的成员变量的大小,那应当输出5
return 0;
}
但结果是8
好啦,这次枚举,联合(共用体)就讲解到这里。下一次会继续记录我学习的过程。希望能对大家有所帮助。