自定义类型:联合体和枚举

接下来,我要讲的两个自定义类型是联合体和枚举。这两个自定义类型对于很多人来说可能是第一次听说。但是其实这和我们前面学习的结构体是差不多的。接下来我就来给大家讲一讲这两个的具体知识点以及注意事项,还有它们与结构体之间的区别。好了,我们废话不多说,现在开始我们的博客。

1.联合体类型的声明

联合体和结构体是产不多的。也是有多个成员变量构成的。这些成员可以是不同的类型。联合体的关键字是union。但是,对于联合体来说,他与结构体的一个主要区别就是,联合体的所有成员都是共用一块内存空间。所以联合体也被叫做共用体。也就是说,联合体中的一个成员发生改变其他成员都会发生改变。接下来,我就来给大家写一个联合体出来。请看下面的图片。

上面的图片展示的就是一个联合体的声明。接下来,我就来给大家写一下联合体的一般声明的形式。大家请看下面的代码块。

cpp 复制代码
union name//联合体名字
{
member-list//联合体成员列表
};

感兴趣的朋友也可以按照上面的形式来创建一个联合体。

2.联合体的特点

在上面的博客中,我提到了,联合体中的成员都是共拥有一块内存的,接下来,我就来给大家西俄代码展示一下,顺便验证一下我上面的话是否正确。大家请看下面的代码图片以及它的运行结果。

大家看到没有,无论是联合体的整体还是联合体里面的成员变量的地址都是一样的。这就验证了联合体就叫做共用体。那么既然联合体公用同一块内存,那么当我改变上面其中之一的成员变量,那么其他的成员变量也会随之改变。大家请看下面的代码图片。

大家看到没有,我把i赋值为11223344,但是因为c的赋值而改变了i的值。这也就验证了上面我说的,只要改变联合体中的一个成员变量就会改变另外的成员变量。为了让大家更好理解,接下来,我就来画一张图让大家好好理解理解这其中的道理。大家请看下面的图片。

上面的图片就是模仿联合体在内存中的存储方式,看了这个图我就希望大家可以更好的理解理解联合体被成称为共用体的原因,希望大家可以更好的理解。

3.联合体大小的计算

像之前的博客一样,既然联合体和结构体差不多,那是不是它的大小呵呵结构体一样也存在内存对齐的规则呢?其实联合体的大小比结构体的大小简单多了。他不存在内存对齐。接下来我就来给大家讲一讲联合体的大小计算方式。

1.联合体的大小至少是成员变量中的最大的那一个

2.当联合体中的最大成员变量的大小不是最大对齐数的整数倍时,此时的联合体的大小为最大对齐数的整数倍(这里的最大对齐数的概念在上一篇博客中讲过,这里就不再赘述)

接下来,我就来给大家演示一个联合体的大小计算。请看下面的图片。

好了,,上面的两个例子就是联合体大小的计算方式。大家也可以看看自己有的联合体然后自己尝试计算一下。

4.枚举类型的声明

大家在看到枚举的时候可能会有点懵,可能就是在想什么是枚举。其实很简单,枚举就是一一列举的意思。就是把可能的取值都一一列举出来。就像一些我们生活中的例子一样。性别可以一一列举,星期看可以一一列举,三原色也是可以一一列举的。接下来,我就来用星期的例子来写一个枚举给大家看看,大家请看下面的图片。

上面的图片展示的就是一个关于星期的枚举的声明。接下来,我会通过这个例子来给大家讲一讲枚举的一些知识点。

1.枚举的关键字为enum

2.花括号中的成员都是以逗号隔开,最后一个成员是不带逗号的,这些都叫做可能取值

3,这些可能取值编译器都会编号,都是从0开始的。当自定义了第一个取值的编号时,下面的取值就会按照自定义的编号向下取值

上面的知识点3,我就用代码以及结果的方式给大家展示一下。

编译器编号

自定义编号

5.枚举类型的优点

大家不要看枚举很麻烦,其实枚举还是有很多优点的,大家看下面的枚举的特点。

6.枚举类型的使用

接下来,我就来给大家展示一下枚举的使用,大家请看下面的代码。

好了,今天的博客就分享到这里了,希望我的博客对你的C语言学习有帮助,我们下一篇博客再见!!!

相关推荐
算法鑫探2 小时前
显示器插座最短连线算法(蓝桥杯十六届C组编程题第二题)
c语言·数据结构·算法·排序算法·新人首发
女王大人万岁2 小时前
Golang实战gRPC与Protobuf:从入门到进阶
服务器·开发语言·后端·qt·golang
时寒的笔记2 小时前
js基础05_js类、原型对象、原型链&案例(解决无限debugger)
开发语言·javascript·原型模式
人间打气筒(Ada)2 小时前
「码动四季·开源同行」go语言:如何使用 ELK 进行日志采集以及统一处理?
开发语言·分布式·elk·go·日志收集·分布式日志系统
波波0072 小时前
每日一题:C#中using的三种用法
开发语言·c#
游乐码2 小时前
c#万物之父
开发语言·c#
xiaoshuaishuai82 小时前
C# Chrome安全机制解析
开发语言·visualstudio·c#
游乐码2 小时前
c#字符串函数
开发语言·c#
yaoxin5211232 小时前
375. Java IO API - 列出目录内容
java·开发语言·python