通关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++中类型检查更加严格。

相关推荐
HABuo8 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
2401_8589368813 小时前
【Linux C 编程】标准 IO 详解与实战:从基础接口到文件操作实战
linux·c语言
季明洵16 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
浅念-16 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒16 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森16 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
C++ 老炮儿的技术栈17 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
wangjialelele18 小时前
Linux下的IO操作以及ext系列文件系统
linux·运维·服务器·c语言·c++·个人开发
wengqidaifeng20 小时前
数据结构(三)栈和队列(上)栈:计算机世界的“叠叠乐”
c语言·数据结构·数据库·链表
VekiSon21 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件