C语言进阶学习笔记四自定义类型(枚举+联合)

Posted 大家好我叫张同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶学习笔记四自定义类型(枚举+联合)相关的知识,希望对你有一定的参考价值。


枚举

什么是枚举?

顾名思义,枚举就是一一列举。将可能的取值都一一列举出来就是枚举。

比如说我们的现实生活中:
①一周的可能取值,从周一到周日,总共7个可能取值
②性别的取值,男,女,保密,总共3种可能取值(当然你也可以再添加一种取值可能,比如说未知,但是添加之后的可能取值仍然是可以一一列举出来的,总共4种可能了)
③月份的可能取值,从一月到十二月,总共12个可能取值
④颜色的可能取值,比如说红橙黄绿青蓝紫


如何定义枚举类型呢?

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	sun
};
enum sex//性别
{
	MALE,
	FEMALE,
	SECRET
};
enum color//颜色--三原色 rgb
{
	RED,
	GREEN,
	BLUE
};

以上定义的enum Day, enum sex,enum color都是枚举类型。
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值,这些值叫做枚举常量。
例如:

enum color//颜色--三原色 rgb
{
	RED = 1,
	GREEN = 2,
	BLUE = 3
};

此时该枚举类型的常量值为1,2,3。


枚举的优点

为什么使用枚举 ?

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


枚举的使用

enum color//颜色
{
	RED = 1,
	GREEN = 2,
	BLUE = 4
};
enum color c1r = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;// ok ? ?
//枚举常量和常量值是有区别的,将常量直接赋值给枚举常量类型,编译器会报错或警告

扩展:枚举类型的常量如果中间某个值被自定义赋值,那么其前面的值仍然从0开始递增,其后面的值按照自定义的值递增。
在这里插入图片描述
枚举是一种类型,可以用来定义变量-- - 枚举变量,但是其成员是常量值-- - 枚举常量


联合

联合类型的定义

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

比如∶

#include<stdio.h>
	//联合类型的声明
	union Un
{
	char c;
	int i;
};
int main()
{
	union Un u;
	printf("%d\\n", sizeof(u));
	printf("%d\\n", sizeof(u.c));
	printf("%d\\n", sizeof(u.i));

	printf("%p\\n", &u);
	printf("%p\\n", &(u.c));
	printf("%p\\n", &(u.i));
	return 0;
}

在这里插入图片描述
内存分析:
在这里插入图片描述


联合的特点

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


联合大小的计算

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

举例:

#include<stdio.h>
union u1
{
	char ch[5];
	int i;
};
union u2
{
	short s[7];
	int i;
};
int main()
{
	printf("%d\\n", sizeof(union u1));
	printf("%d\\n", sizeof(union u2));
	return 0;
}

分析:

u1中数组ch有5个元素,大小为5个字节,那么u1大小为5,但是因为5不是最大对齐数4(int)的倍数,对齐到最大对齐数4后大小为8。
u2中数组s有7个元素,大小为7 * 2 = 14个字节,14不是最大对齐数4的倍数,对齐到4的倍数后大小为16。

结果展示:
在这里插入图片描述

总结:
结构体、共用体存在内存对齐
枚举、位段不存在内存对齐

以上是关于C语言进阶学习笔记四自定义类型(枚举+联合)的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶学习笔记四自定义类型(结构体+位段)

C语言学习笔记(15)自定义类型:结构体,枚举,联合

C语言进阶自定义类型详解(结构体+枚举+联合)

自定义类型详解(结构体+枚举+联合)C进阶

C语言自定义数据类型中的结构体,枚举,联合详解

“解剖”c语言——自定义类型(结构体,位段,枚举,联合体)