当前位置: 首页 > news >正文

C语言零基础第19讲:自定义类型—联合体和枚举

目录

1.联合体

1.1 联合体类型的声明

1.2 联合体的特点

1.3 结构体和联合体对比

​编辑

1.4 联合体大小的计算      

1.5 联合体的练习

2.枚举

2.1 枚举的声明

2.2 枚举类型的优点

2.3 枚举类型的使用


正文开始

1.联合体

1.1 联合体类型的声明

        联合体的关键字是union

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

        我们来看一下声明的示例: 

union Un
{char c;int i;
};

1.2 联合体的特点

        对于联合体,编译器只为最大的成员分配足够的内存空间

        对于联合体,所有成员共用同一块内存空间,所以联合体也叫共同体。

        所以一个联合体变量的大小,至少是最大成员的大小(因为联合体至少要有能力保存最大的那个成员)

        请看下面的代码:

        如上,联合体的成员中,c为1个字节,i为4个字节。使用sizeof计算联合体变量的大小,得出的结果为4,可以印证,编译器只为最大的成员分配足够的内存空间。

        我们将联合体变量,及其成员的地址打印出来,发现都是一样的。可以印证,所有的成员共用同一块内存空间。

        因为联合体所有成员共用同一块内存空间,所以给其中一个成员赋值,其他成员的值也跟着变化。请看代码示例:

        如上,结构体的大小为4个字节。首先给i赋值,4个字节中分别放着:44、33、22、11。然后再给c赋值,i的值也随之发生变化,内存中变为:55、33、22、11。

1.3 结构体和联合体对比

        我们再对比一下,相同成员的结构体和联合体,它们的内存布局情况。

//结构体:              //联合体:
struct S               union Un
{                      {char c;                char c;int i;                 int i;
};                     };
struct S s = {0};      union Un un = {0};

        显然,使用联合体,是可以节省空间的

1.4 联合体大小的计算      

        联合体的大小是怎么计算的呢?具体的规则如下:

  1. 联合体的大小,至少是最大成员的大小,但这并不意味着等于最大成员的大小。
  2. 不同的编译器,有不同的默认对齐数。VS中msvc默认为8,Linux中gcc没有默认对齐数,对齐数就是成员自身的大小。
  3. 联合体中的每个成员都对应着一个对齐数。
  4. 拿某成员自身的大小,去和默认对齐数作比较,谁更小,谁就是该成员对应的对齐数。
  5. 联合体的总大小,必须是最大对齐数的整数倍。

        我们来看一个例子:

        我们可以再做一个练习:

1.5 联合体的练习

        题目:写一个程序,判断当前机器是大端还是小端字节序。

2.枚举

2.1 枚举的声明

        枚举,顾名思义,就是把可能的取值列举出来

        比如,在我们的现实生活中,一周有7天,可以一一列举。月份有12个月,也可以一一列举。

        我们来看一个举例:

        上面定义的enum day就是一个枚举类型,{}中的内容是枚举类型的可能取值,也叫枚举常量。这些枚举常量,都是有值的,依次为:0,1,2,3...,请看示例:

        对于枚举常量,我们在声明枚举类型的时候,也可以赋初值

2.2 枚举类型的优点

        如上,我们可以使用#define定义常量,为什么非要使用枚举呢?枚举到底有什么好?

        我们来看一下枚举的优点:

  1. 增加代码的可读性和可维护性。
  2. 和#define定义的标识符相比,枚举有类型检查,更加严谨。
  3. 在调试阶段可以观察枚举变量,#define定义的符号不能被观察。
  4. 使用方便,一次可以定义多个常量。
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。

2.3 枚举类型的使用

        我们再来加深一下印象, 枚举类型的使用方式:

        那么,是否可以拿整数来给枚举变量赋值呢?在C语言中是可以的,但是在C++中是不行的,C++的类型检查比较严格。


完结

http://www.lryc.cn/news/624045.html

相关文章:

  • 1. Docker的介绍和安装
  • 区块链练手项目(持续更新)
  • 电容,三极管,场效应管
  • 【状压DP】3276. 选择矩阵中单元格的最大得分|2403
  • 电动车安全技术全解析:从传统制动到智能驾驶的技术革命
  • MySQL深度理解-MySQL8新特性
  • 三种变量类型在局部与全局作用域的区别
  • 深入理解C#特性:从应用到自定义
  • 一起Oracle 19c bug 导致的业务系统超时问题分析
  • 嵌入式C语言学习笔记之枚举、联合体
  • Jenkins - CICD 注入环境变量避免明文密码暴露
  • 图解直接插入排序C语言实现
  • 跨越南北的养老对话:为培养“银发中国”人才注入新动能
  • 数据准备|生成折线图
  • Python自学09-常用数据结构之元组
  • Java语法进阶之常用类
  • 【新手入门】Android基础知识(二):Binder进程间通信,理解Binder工作原理以及Binder实体、Binder引用、Binder代理概念
  • K8S集群环境搭建(一)
  • 双指针和codetop2(最短路问题BFS)
  • Maven依赖范围
  • 检查xrdp远程连接桌面卡顿的问题(附解决sh脚本)
  • STM32入门之USART串口部分
  • # C++ 中的 `string_view` 和 `span`:现代安全视图指南
  • 多墨智能-AI一键生成工作文档/流程图/思维导图
  • Transformer 面试题及详细答案120道(61-70)-- 解码与生成
  • Spring IOC 学习笔记
  • Spring 创建 Bean 的 8 种主要方式
  • Vue3 中的 ref、模板引用和 defineExpose 详解
  • 数据结构初阶(18)快速排序·深入优化探讨
  • 【深度学习-基础知识】单机多卡和多机多卡训练