【c语言进阶】自定义类型-枚举+联合(共用体)详解

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第1张图片

目录

 1.枚举

1.1枚举类型的定义

1.2枚举常量的创建和初始赋值

2.枚举的优点

3.枚举的使用 

4. 联合(共用体)

4.1 联合类型的定义

4.2 联合体的特点

4.3联合体大小的计算 

4.4联合体的运用-判断程序的大小端存储 

5.结语


 1.枚举

枚举顾名思义就是一一列举。 把可能的取值一一列举。

比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一一列举。

性别有:男、女、保密,也可以一一列举。

月份有12个月,也可以一一列举

当我们要集体描述这些数据这里就可以使用枚举了

1.1枚举类型的定义

使用enum关键字,枚举成员之间用,隔开

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};
enum Color//颜色
{
 RED,
 GREEN,
 BLUE
};

 以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。 {}中的内容是枚举类型的可能取值,也叫 枚举常量 。

1.2枚举常量的创建和初始赋值

enum Color
{
RED,
GREEN,
BLUE
};

int main()
{
enum COlor c = GREEN;
return 0;
}

{}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从0开始,依次递增1

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第2张图片

当然在声明枚举类型的时候也可以赋初值,例如:

enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE=4
};

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第3张图片

2.枚举的优点

为什么使用枚举? 我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点

1. 增加代码的可读性和可维护性

2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

3. 便于调试

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

3.枚举的使用 

enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;        

clr = 5;    

这样的代码在C语言这种语法检查不那么严格的可以这么书写,但是在c++这样的环境里面就会出行类型不匹配,因为枚举是有类型的是枚举类型。但是5是int 类型。如果是#define定义的类型就可以,因为没有类型

4. 联合(共用体)

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

4.1 联合类型的定义

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

当我们计算这个联合体的大小我们发现:

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第4张图片

好像既不是对齐也不是将成员大小进行相加,那么联合体的存储是什么样的,我们看一下:

4.2 联合体的特点

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

我们对上述结构体中的成员打印地址可以发现:

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第5张图片

两个成员的地址是一样的,就是说联合体的成员共用一块空间。

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第6张图片

所以联合体也叫作共用体,也就意味着联合体的成员在同一时间只能使用一个,改变一个,另外一个也会被改变。

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第7张图片

4.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));

un1:

char c 是一个数组,按成员类型算,char 类型大小是1,vs环境下默认对齐数是8,所以字符数组的对齐数是1,i的对齐数是4,那么最大对齐数是4.那么第一个输出就应该是8,第二个应该是16.

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第8张图片

4.4联合体的运用-判断程序的大小端存储 

当我们没有学过联合体的时候我们判断程序大小端的思路是定义一个整型赋值为1,将这个整型的第一个字节内容取出看是否为1,是1就是小端,不是就是大端。

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第9张图片

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第10张图片

当有了共用体,由于1两个成员共用一块空间,我们可以这样判断:
 

union Un
{
	int i;
	char c;
};
int main()
{
	union Un u = { 0 };
	u.i = 1;
	
	if(u.c== 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

 【c语言进阶】自定义类型-枚举+联合(共用体)详解_第11张图片

5.结语

   以上就是本期的所有内容,知识含量蛮多,大家可以配合解释和原码运行理解。创作不易,大家如果觉得还可以的话,欢迎大家三连,有问题的地方欢迎大家指正,一起交流学习,一起成长,我是Nicn,正在c++方向前行的奋斗者,感谢大家的关注与喜欢。

【c语言进阶】自定义类型-枚举+联合(共用体)详解_第12张图片 

你可能感兴趣的:(c语言,开发语言,算法,数据结构)