自定义类型(二):枚举和联合体(共用体)


一、枚举常量

枚举常量顾名思义就是把可能的取值依次列举,且这些可能的取值具有常量的属性。

比如:
一周的星期一到星期日是有限的7天,可以依次列举。
性别有男、女,也可以依次列举。
月份有12个月,也可以依次列举。

要记录这些可能的取值,数组当然可行,但C语言提供了一种更加方便的方式:枚举。

1.枚举常量的定义

代码如下(示例):

enum Weekday//星期
{
    
    
	Mon,//常量间用逗号分开
	Tue,
	Wed,
	Thu,
	Fri,
	Sat,
	Sun//注意最后一个常量后没有逗号
};

enum Sex
{
    
    
	Male,
	Female
}

这些枚举常量中的常量都有对应的值,默认第一个常量从0开始,依次递增1,当然在定义的时候也可以赋初值。

代码如下(示例):

enum Weekday1
{
    
    
	//不赋初始值,默认从0开始递增1
	Mon,//0
	Tue,//1
	Wed,//2
	Thu,//3
	Fri,//4
	Sat,//5
	Sun//6
};

enum Weekday2
{
    
    
	//给某个常量赋初始值,则从该常量开始递增1
	//该常量之前的不受影响
	Mon,//0
	Tue,//1
	Wed = 10,//10
	Thu,//11
	Fri,//12
	Sat,//13
	Sun//14
};

2.枚举常量的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
(1) 增加代码的可读性和可维护性
(2) 和#define定义的标识符比较枚举有类型检查,更加严谨
(3) 防止了命名污染(将常量封装起来)
(4) 便于调试
(5) 使用方便,一次可以定义多个常量

二、联合体(共用体)

1.联合体类型的定义

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

代码如下(示例):

//联合类型的声明
union Un 
{
    
     
	char c; 
	int i; 
	double d;
}; 
//联合变量的定义
union Un un;

1.联合体中的变量

由于联合体中的变量共用同一块空间,所以在改变其中一个值的时候会影响到其他的值。

代码如下(示例):

union Un
{
    
    
	int a;
	int b;
	int c;
};

int main()
{
    
    
	union Un un;
	
	//下面的三个地址均相同
	printf("%d\n", &(un.a));
	printf("%d\n", &(un.b));
	printf("%d\n", &(un.c));
	
	un.a = 1;
	printf("%d\n", un.b);//1
	printf("%d\n", un.c);//1

	un.b = 2;
	printf("%d\n", un.a);//2
	printf("%d\n", un.c);//2
	
	return 0;
}

2.联合体大小的计算

联合体的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

代码如下(示例):

union Un1 
{
    
     
	char c[5]; 
	int i; 
}; 
union Un2 
{
    
     
	short s[7]; 
	int i; 
}; 
printf("%d\n", sizeof(union Un1)); //8
//c数组占5个字节,对齐数为1;i变量占4个字节,对齐数为4
//联合体大小至少为5个字节,对齐到最大对齐数的整数倍,即为8
printf("%d\n", sizeof(union Un2));//16
//s数组占14个字节,对齐数为2;i变量占4个字节,对齐数为4
//联合体大小至少为14个字节,对齐到最大对齐数的整数倍,即为16

感谢阅读,如有错误请批评指正

猜你喜欢

转载自blog.csdn.net/weixin_51983604/article/details/115359437