枚举和联合(共用体)

  • Post author:
  • Post category:其他


从名字来看,枚举的意思就是列举,把可能的取值列举出来.

从我们的日常生活中来看,有很多例子:

1.一周的星期一到星期日是固定的7天,就可以列举出来.

2.从性别来看,有男,女两种.

3.月份也类似于一周,有固定的十二个月,也可以列举出来.

类似于这样的例子有很多,碰到这样的情况,我们就可以使用枚举了.

枚举类型的定义

先来看几个例子:

enum Day{	//星期
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
	Sunday
};
enum Sex{	//性别
	Male,
	Female
};
enum Color{	//颜色
	Red,
	Yellow,
	Blue
};

在上面我们定义的enum Day, enum Sex, enum Color都是枚举类型.

在{}中的内容是枚举类型的可能取值,也叫作枚举常量.

枚举常量的取值默认从0开始,依次递增1,当然我们可以在定义的时候给枚举常量赋初值.比如:

enum Color{	//颜色
	Red = 1,
	Yellow = 2,
	Blue = 4
};

枚举的优点:

1.枚举能够增加代码的可读性和可维护性

2.枚举由类型检查,更加严谨

3.便于调试

4.使用方便,可以一次定义多个常量

枚举的使用

enum Color{	//颜色
	Red = 1,
	Yellow = 2,
	Blue = 4
};
enum Color clr = Blue;	//只能拿枚举常量给枚举变量赋值
int main(){
	printf("%d\n", clr);
	system("pause");
	return 0;
}

不能像下面这样使用

enum Color{	//颜色
	Red = 1,
	Yellow = 2,
	Blue = 4
};
enum Color clr = Blue;
clr = 5;
int main(){
	printf("%d\n", clr);
	system("pause");
	return 0;
}

这样就会报错,提示重定义,多次初始化

在这里插入图片描述

关于联合类型的定义

联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,而他们的特征就是这些成员会共用同一块空间(所以联合也叫共用体),比如:

#include <stdio.h>
#include <stdlib.h>
//联合类型的声明
union Un{
	char c;
	int i;
};
//联合变量的定义
union Un un;
int main(){
	//计算联合变量的大小
	printf("%d\n", sizeof(un));
	system("pause");
	return 0;
}

联合体的成员是共同运用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(联合体至少得有能力保存最大的那个成员)

#include <stdio.h>
#include <stdlib.h>
union Un{
	int i;
	char c;
};
union Un un;
int main(){
	printf("%d\n", &(un.i));
	printf("%d\n", &(un.c));
	system("pause");
	return 0;
}

思考一下,下面的输出结果一样吗?

printf(“%d\n”, &(un.i));

printf(“%d\n”, &(un.c));

在这里插入图片描述

联合体共用同一块空间,所以输出结果一样.

关于联合体大小的计算

1.联合体的大小至少是最大成员的大小.

2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍.

比如:

#include <stdio.h>
#include <stdlib.h>
//关于联合体大小的计算
union Un1{
	char c[5];
	int i;
};
union Un2{
	short c[7];
	int i;
};
int main(){
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	system("pause");
	return 0;
}

在这里插入图片描述

首先它们的最大对齐数都是4,Un1的最大成员大小为5,不是4的整数倍,所以对齐到8字节.Un2的最大成员大小为14(short类型为2字节),不是4的整数倍,所以对齐到16字节.



版权声明:本文为weixin_44781107原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。