CSDN话题挑战赛第2期
参赛话题:
前言
这篇文章是对枚举与联合体这两个自定义类型的详细解释,阅读这篇文章,你可以使用枚举来代替define,你还可以学会考点联合体大小的计算以及用联合体来判断大小端存储。
一.枚举
1.枚举的定义
枚举在C/C++/c#中,是一个被命名的整型常数 的集合, 枚举在日常生活中很常见。
-
例如:表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY,就是一个枚举。
-
枚举的结构和结构体类似
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
-
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。 -
这些可能取值都是有值的,默认从0开始,一次递增1,比如enum Sex 中国 MALE,FEMALE 分别对应数字 0, 1 。
-
在定义的时候也可以赋初值。
例如:
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
2.枚举与define
有些读者可能会有些疑惑,不是可以用#define来定义常量么
为什么要使用枚举呢?
那是因为枚举具有很多优点:
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
3.枚举的使用
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;
-
只能拿枚举常量给枚举变量赋值 ,才不会出现类型的差异。
不过编译器不是特别严谨的话不会报错。 -
枚举中成员是常量 ,因此不能在枚举外赋值。
二.联合体
1.联合体的定义
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量 存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用 一段内存的结构。
在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
比如:
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
2.联合体的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小 (因为联合至少得有能力保存最大的那个成员)。
union Un
{
int i;
char c;
};
union Un un;
下面输出的结果一样么?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
结果如下:
-
这个例子可以证明联合体中的成员确实是共用一块内存的。
-
让我们回顾之前见过的一道面试题
判断当前计算机的大小端存储
- 让我们尝试用联合体来解决它。
union Un
{
int i;
char c;
}u;
int main()
{
u.i = 1;
printf("%d", u.c);
return 0;
}
- i和c占用相同的空间,我们知道1的16进制是 00 00 00 01,char类型占用一个字节,因此若为小端存储,即低字节数存储在低地址处(01 00 00 00),就会输出1。
3.联合体大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
比如:
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
char c[5]的大小是5,不是最大对齐数4的整数倍,因此结果为8
short c[7]的大小事14,不是最大对齐数4的整数倍,因此结果为16
最后
如果这篇文章对你有用的话,不妨点赞 收藏 关注。感谢支持!