枚举和联合(共用体)

从名字来看,枚举的意思就是列举,把可能的取值列举出来.
从我们的日常生活中来看,有很多例子:
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字节.

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值