通关C语言自定义类型:联合和枚举

C语言的自定义类型 有四个分别是:数组;结构体(struct);联合体(union);枚举(enum)。前面已经讨论过数组和结构体,这期让我们来学习一下联合体和枚举类型。

一、联合体类型

1、联合体类型的声明

与结构体相似,联合体 也是由一个或者多个成员 构成,这些成员可以是不同的类型

但是编译器只为最大的成员分配足够的内存空间 。联合体的特点是所有成员共用同一块内存空间 。所以联合体也叫:共用体

给联合体其中一个成员赋值,其他成员的值也跟着变化。

2、联合体的特点

由上述代码运行结果,可知,联合的成员是共用同一块内存空间的(各个成员的起始地址和整个联合体的起始地址都相同),这样的话,我们也可以推知,一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

联合体的成员在同一时间只能使用其中一个成员。

3、联合体大小的计算

(1)联合的大小至少是最大成员的大小

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

使用联合体是可以节省空间的。

4、相同成员的结构体和联合体对比

5、通过判断大小端程序进一步认识联合体

#include<stdio.h>

int check();

union Un

{

int i;

char c;

}un;

int main()

{

un.i = 1;

if (check())

{

printf("小端\n");

}

else

{

printf("大端\n");

}

}

int check()

{

return un.c;

}

二、枚举类型

1、枚举类型的声明

枚举 顾名思义就是一一列举。把可能的取值一一列举。比如我们现实生活中:

一周的星期一到星期日是有限的 7 天,可以一一列举;性别有:男、女、保密,也可以一一列举;月份有 12 个月,也可以一一列举;三原色,也可以一一列举。这些数据的表示就可以使用枚举了。

以上定义的enum Day就是枚举类型

{}中的内容是枚举类型的可能取值。也叫枚举常量 。这些可能取值都是有值的,默认从0开始 ,依次递增1,当然在声明枚举类型的时候也可以赋初值。

2、枚举类型的优点

我们知道可以使用 #define 来定义常量,那么枚举到底有什么魔力,可以让我们心甘情愿地使用枚举呢?

(1)枚举增加了代码的可读性和可维护性;

(2)和 #define 定义的标识符相比,枚举有类型检查,更加严谨;

(3)枚举便于调试,而 #define 定义的符号在预处理阶段会被删除;

(4)枚举使用方便,一次可以定义多个常量;

(5)枚举常量是遵循作用域规则的,如果枚举声明在函数内,就只能在函数内使用。

3、枚举类型的使用

需要注意的是:在C语言中可以拿整数给枚举变量直接赋值,但是在C++中是不可以的,因为C++中类型检查更加严格。

相关推荐
古月居GYH1 小时前
嵌入式C语言高级编程:OOP封装、TDD测试与防御性编程实践
c语言·开发语言·tdd
汤姆_5111 小时前
【c语言】深入理解指针1
c语言·开发语言
Y1anoohh3 小时前
驱动学习专栏--字符设备驱动篇--2_字符设备注册与注销
linux·c语言·驱动开发·学习
Wythzhfrey3 小时前
单片机Day05---静态数码管
c语言·单片机·嵌入式硬件·学习·c#·51单片机
ん贤4 小时前
图论基础理论
c语言·数据结构·c++·算法·图论
夜月yeyue4 小时前
VScode+OpenOCD+HTOS栈回溯在国产mcu芯片上完全调试
c语言·ide·vscode·单片机·嵌入式硬件·编辑器
越城7 小时前
冒泡与 qsort 排序策略集
c语言·开发语言·算法·排序算法
Kisorge8 小时前
【控制学】控制学分类
c语言
迷迭所归处8 小时前
C语言 —— 指尖跃迁 刻印永恒 - 文件操作
c语言
CP-DD9 小时前
C/C++ 通用代码模板
c语言·开发语言·c++