• C语言——联合与枚举


    大家好,上篇文章和大家分享了C语言中的自定义类型结构体。接下来,我们再来了解一下其他的自定义类型——联合与枚举,记得三连支持一下哦!

    ebe3d837b8494cd9b8ef4127ff0ed828.jpeg

    一、联合体

    像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。

    1.联合体类型的声明

    联合体的声明和结构体类似。

    如:

    957cdaeeb750438a8e9c9776120b1779.png

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

    a785226249da43da9ee3665ce8c18e7d.png90913c4f44db4ea2b89439450bf2af8b.pngf3620606b12e46d2a07b801986735b2a.png

    我们可以看到,个成员赋值后,其他的成员的值也发生了改变了,这是为什么呢?这肯定和它的存储方式有关。

    2.联合体的特点

    为了搞清联合体的特点我们先来看看一个联合体变量的大小,会不会和结构体一样呢?

    ac00597b8a8a4fde9985d6e9eff12ec9.png

    我们可以看到是4个字节,只占一个整型的大小。

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

    我们可以来打印一下各个成员的地址,看看是不是这样:

    098e77bea46445458020328171161c60.png

    我们可以看到每个成员地址都是一样的,它们确实共用一块地址。

    fafd2cc88923427ab63914bdf96e96aa.png

    上面这段代码我们可以看到:a的第四个字节的内容修改为55了.

    8dec2b10914a4d9f9736253b28f7e908.png

    3.联合体大小的计算

    通过上面的观察我们可以发现,结构体比较浪费空间,而联合体是比较节省空间的。

    所以联合体计算大小:

    1.联合的⼤⼩⾄少是最⼤成员的⼤⼩。
    2.当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

    下面我们来看例子:

    94c1336c97c648c191714bc3a11cea04.png

    它们的大小为什么是这么多呢?

    d91ae5739c8b42ee81e44989e918267f.png3bfc1146a27248caab97b08edea4a399.png

    从上面我们可以看出:联合体是非常节省空间的,但也不是无节制的节省。

    二、枚举

    枚举也是一个自定义类型,枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举。

    比如:一周的星期一到星期日可以列举出来;

    月份有十二个月也可以列举,等等。

    1.枚举类型的声明

    枚举的声明也和结构体类似。如:

    dc51d326c30444f9b26b6080be27fd29.png3c35c11173614770bd861f962e8a240e.png

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

    这些可能取值都是有值的,默认从0开始,依次递增1。如:95f1895f56b444d086e018f65c751332.png

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

    通俗来讲,枚举类型和#define差不多,但是并不相同。

    2.枚举类型的优点

    我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?
    枚举的优点:
    1. 增加代码的可读性和可维护性;
    2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨;
    3. 便于调试,预处理阶段会删除 #define 定义的符号;
    4. 使⽤⽅便,⼀次可以定义多个常量;
    5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤。

    所以说枚举还是有许多优点的。

    3.枚举类型的使⽤

    那么枚举该怎么使用呢?最主要的用法上面已经介绍了。1da112a4a8f84c4e99a8f7c89aaadd08.png

    那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
    好了,以上就是本篇文章的全部内容了,感谢大家的观看,创作不易,三连支持一下吧!

    812dd1a160274e53b45d2b148cd7ba71.gif

  • 相关阅读:
    哪种网站适合物理服务器
    (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
    【第七篇】商城系统-商品发布-SKU和SPU管理
    【图像分割】距离正则化水平集演化及其在图像分割中的应用(Matlab代码实现)
    【JVM笔记】Minor GC、Major GC和Full GC
    Kubernetes:kubelet 源码分析之探针
    centos7篇---centos7中安装mongodb
    从事电力行业施工需要什么资质,电力工程资质有什么作用
    ReactNative安卓首屏白屏优化
    科技与狠活儿丨Vue项目中Pinia状态管理工具的使用
  • 原文地址:https://blog.csdn.net/2301_79697817/article/details/138066764