结构体,联合体,枚举( 2 )

目录

2.联合体

2.1联合体类型的声明

2.2联合体的特点

2.3联合体的内存大小

3.枚举

3.1枚举类型的声明

3.2枚举类型的优点

3.3枚举类型的使用


2.联合体


        联合体(Union)是另一种复合数据类型,它允许我们在同一内存位置存储不同的数据类型,但在任意时刻只能存储其中一个类型的值。联合体的大小由其最大成员决定,这使得它在需要节省内存或者在多个数据类型之间进行切换时非常有用。例如,我们可以使用联合体来存储一个整数或者一个浮点数,根据需要选择存储哪种类型的数据。

2.1联合体类型的声明

        和结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。有意思的是,编译器只会给其中最大的成员来分配足够的空间,这就是联合体最大的特点——所有的成员公用一块内存空间,所以联合体也叫:共用体。

        那么给联合体其中⼀个成员赋值,其他成员的值也跟着变化呢?

仔细想想联合体的成员公用一个内存,那么给它赋值之后好像确实所有的成员值都会发生改变,换一种方式说,联合体调用哪个成员,哪个成员便会使用这块空间,就会输出你所赋的值。

输出结果为:


2.2联合体的特点

        联合体的成员是公用同一块内存空间的,这样一个联合体变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。

这里小编给出两个代码以帮助更好的理解联合体的特点:

代码1:

结果为:

(这里的运行结果每次都会变化,因为计算机会给联合体随机分配空间)

我们仔细分析就可以画出,un的内存布局图。以次来更好的理解

代码2:

结果为:

那么为什么会输出11223355而不是11223344,我们同意来画图分析。

这样是不是就更加理解了联合体的特点呢。


2.3联合体的内存大小

         结构体的内存大小遵循结构体的对齐规则,那联合体的内存大小是不是也应该有对齐规则呢?答案显然是有的。

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。

结果为:


3.枚举


         枚举(Enum)是一种特殊的数据类型,它允许我们定义一个由一组命名的常数组成的集合。枚举在需要定义一组具有明确意义的选项时非常有用,比如一周的七天、一年的四季等。枚举的使用不仅可以提高代码的可读性,还可以避免使用魔术数(Magic Numbers),使得代码更加健壮和易于维护。

3.1枚举类型的声明

        枚举顾名思义就是一一列举,把可能取到的值一一列举。

比如我们生活中的:一周有7天可以一一列举,月份有12个月也可以一一列举,三原色也可以一一列举。

enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};

        以上的enum Day和enum Color都是枚举类型。


3.2枚举类型的优点

        既然是定义常量,那么define也可以用来定义常量,为什么还要创建一个枚举类型呢?

枚举的优点:

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


3.3枚举类型的使用

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4_动画基础_ 瞄准偏移1D(Aim Offset Blend Space 1D)

瞄准偏移1D基本上可以完成角色的向左看向右看或者向上看向下看,像混合空间1D一样只有一个轴向可用。 操作步骤: 1、新建第三人称模板项目。 2、右键——动画——瞄准偏移1D 选取骨骼 双击打开 3、瞄准偏移混合的是姿势,我们需要创建姿势。 …

结合创新!多尺度特征融合+Transformer,参数和计算成本减半

通过多尺度特征融合,模型能够捕捉到不同层次的视觉细节,而Transformer的自注意力机制能够在这些不同层次的特征之间建立联系,有效地整合全局上下文信息,让模型能够应对多样化的视觉场景和变化。 这种结合策略充分利用了二者各自的…

Android 手机部署whisper 模型

Whisper 是什么? “Whisper” 是一个由OpenAI开发的开源深度学习模型,专门用于语音识别任务。这个模型能够将语音转换成文本,支持多种语言,并且在处理不同的口音、环境噪音以及跨语言的语音识别方面表现出色。Whisper模型的目标是提供一个高效、准确的工具,以支持自动字幕…

npm(Node Package Manager)

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的默认包管理器&#xff0c;它用于安装、更新、配置和移除 Node.js 应用程序中的包。以下是一些常用的 npm 命令&#xff1a; 1. 安装包 npm install <package> - 安装一个包到当前项目&#xff08;默认为 …

2024.4.3 controller+soem双进程调试

需要数据&#xff1a; 各关节减速器减速比&#xff08;符号与关节方向电机方向相关&#xff09;编码器位数17位131072、20位1048576&#xff0c;23位8388608&#xff08;与关节转角换算到电机端脉冲值有关&#xff09;DH参数&#xff08;主要是连杆长度&#xff0c;建立名义运…

库位电子标签可视化管理,让仓库更智能

一、工厂仓储的目前管理现状 目前工厂仓储管理存在诸多问题&#xff0c;如物料数量种类多&#xff0c;寻找困难且耗时&#xff1b;盘点人力成本高且速度慢&#xff1b;存储位置不清晰&#xff0c;常找不到物料&#xff0c;且多发、少发、错料现象时有发生&#xff1b;系统与库…

SSTI模板注入(jinja2)

前面学习了SSTI中的smarty类型&#xff0c;今天学习了Jinja2&#xff0c;两种类型都是flask框架的&#xff0c;但是在注入的语法上还是有不同 SSTI&#xff1a;服务器端模板注入&#xff0c;也属于一种注入类型。与sql注入类似&#xff0c;也是通过凭借进行命令的执行&#xff…

Qt-在QLabel上显示Mat数据

0. 写在前面 用于记录一下&#xff0c;在Qt上显示Mat的数据&#xff0c;记录代码如下&#xff1b; //QLabel中显示处理结果 void MainWindow::matToLabelShow(QLabel *label, Mat &mat) {cv::Mat Rgb;QImage Img;if (mat.channels() 3)//RGB Img{cv::cvtColor(mat, Rgb,C…

C++ 中的 vector 的模拟实现【代码纯享】

文章目录 C 中的 vector 模拟实现1. vector 的基本概念2. vector 的基本操作3. vector 的模拟实现4.代码纯享5. 总结 C 中的 vector 模拟实现 在 C 中&#xff0c;vector 是一个非常重要的容器&#xff0c;它提供了动态数组的功能。在本篇博客中&#xff0c;我们将尝试模拟实现…

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法&#xff1a;直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义&#xff1a;可以少传一个/多个参数给函数&…

防止推特Twitter账号被冻结,应该选什么代理类型IP?

在处理多个 Twitter 帐号时&#xff0c;选择合适的代理IP对于避免大规模帐户暂停至关重要。现在&#xff0c;问题出现了&#xff1a;哪种类型的代理是满足您需求的最佳选择&#xff1f;下面文章将为你具体讲解推特账号冻结原因以及重点介绍如何选择代理IP。 一、推特账号被冻结…

3个 JavaScript 字符串截取方法

在 JavaScript 中&#xff0c;可以使用 substr()、slice() 和 substring() 方法截取字符串. substring() substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集&#xff0c;或从开始索引直到字符串的末尾的一个子集。语法如下&#xff1a; str.substring(inde…

通信术语:初学者入门指南(二)

1.SAR&#xff1a;Synthetic Aperture Radar合成孔径雷达&#xff0c;是一种雷达系统&#xff0c;通常用于地球或行星的遥感成像。相较于传统的实孔径雷达&#xff0c;SAR 通过在相对较长的时间内&#xff0c;对来自同一地点的多个雷达反射信号进行综合处理&#xff0c;实现了更…

.Net 对象与对象之间的映射转换的6中方式以及性能对比

我们在.Net开发的过程中&#xff0c;经常会遇到一个实体对象与另一个实体对象之间的映射转换&#xff0c;接下来我们将依次去实现6个对象间映射转换的方式&#xff0c;并对他们进行性能测试&#xff0c;找出其中效率最高的方式。 通过对象Copy&#xff0c;通过new一个新的实体对…

el-table的复选框勾选整行变色

要实现el-table的复选框勾选整行变色&#xff0c;你可以使用element-ui提供的row-class-name属性结合scoped slot来完成。 首先&#xff0c;你需要为el-table组件添加 row-class-name 属性&#xff0c;并给它绑定一个方法。在这个方法中&#xff0c;你可以根据你的业务逻辑来判…

【C+ +】第一个C+ + 项目的创建及namespace命名空间解释C++中的输入输出

目录 1.创建第一个c项目 1.1项目创建 1.2 .cpp源文件建立 1.3 第一个c程序hello world对比c语言hello world 2.命名空间 2.1 C关键字 2.2 命名空间---解决c语言中的命名冲突 2.2.1 namespace命名空间用法 2.2.2 &#xff1a;&#xff1a; 预作用限定符 2.2.3 命名空间的嵌套…

【嵌入式智能产品开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

目录 Raspberry Pi OS 下载系统镜像 使用SSH客户端登陆 升级更新 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正…

人工智能|深度学习——基于Xception实现戴口罩人脸表情识别

一、项目背景 近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;人脸表情识别已经成为了计算机视觉领域中的重要研究方向之一。然而&#xff0c;在当前的疫情形势下&#xff0c;佩戴口罩已经成为了一项必要的防疫措施&#xff0c;但是佩戴口罩会遮挡住人脸的部分区域&…

c++ new int[10]()会进行初始化.

new int[10]()-CSDN博客 #include<iostream> using namespace std;int main() {int *p new int[10]();for(int i 0; i < 10; i){cout << p[i] << endl;}delete []p; } 会进行初始化.

换到idf 5.0版本后报错 jsmn could not be found

原因&#xff1a; idf5.0去掉了部分组件&#xff0c;包括jsmn&#xff0c;工程中adf又用到了这个组件&#xff0c;所以会报错。 解决办法&#xff1a; 升级adf到新版本即可。