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

C语言:自定义类型——联合和枚举

一、联合体

1.1 联合体类型的声明

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

声明方式如下图:

那联合体和结构体究竟有什么区别呢??

下面将重点讲解联合体的特点!!

1.2 联合体的特点

1.2.1 特点1

所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体

我们可以发现,三个地址打印出来是一样的。那既然都共用一块空间,那大小有多大呢??

1.2.2 特点2

编译器只为最大的成员分配⾜够的内存空间(因为联合体至少得有能力保护最大的那个成员)

1.2.3 特点3

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

这里为什么打印出来的是11223355呢,我们根据3个特点,可以分析画出un的内部布局图

充分说明了特点3!

1.3 联合体的大小

特点2提到,编译器只为联合体最大的成员分配足够的空间,那联合体的大小就一定等于最大成员变量的大小吗??

答案是不对的,我们可以看看下面的代码

我们可以验证出,虽然编译器只为最大的成员分配足够空间,但不代表联合体的大小就是最大成员变量的大小!!!

联合体的大小要遵循以下两个特点:

1、联合的大小⾄少是最⼤成员的大小。

2、当最⼤成员大小不是最大对齐数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

这说明,联合体虽然可以节省空间,但也不是一味地节省,他也是有自己的对齐规则的。

分析上图代码:

Un1的第一个成员数组虽然是5个字节的大小,但是最大对齐数只能取char类型,所以是1,而int是4,所以Un1的最大对齐数是4,为了保证能放下5个字节的空间,所以最大对齐数翻倍变成8!

Un2的第一个成员数组虽然是14个字节的大小,但最大对齐数只能取short类型,所以是2,而int是4,所以Un2的最大对齐数是4,为了保证能放下14个字节的空间,所以最大对齐数翻4倍变成16!

1.4 相同成员的结构体和联合体的对比

我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。

这说明使用联合体是可以节省空间的!!!

1.5 使用联合体节省空间的例子

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息

其他信息:

图书:书名、作者、⻚数

杯⼦:设计

衬衫:设计、可选颜⾊、可选尺⼨

如果直接用结构体的话

但我们会发现,如果创建book变量,那设计、颜色、尺寸属性就会浪费掉。如果创建cup变量,那书名、作者、页数、可选颜色、尺寸属性就会浪费掉。如果创建shirt变量,那书名、作者、页数属性就会浪费掉。这样就会导致内存出现浪费,因为对于礼单兑换单的商品来说,只有部分属性是通用的,所以我们就可以将公共属性单独写出来,剩余属于各种商品自身属性使用联合体联合起来没这样就可以减少所需的内存空间,再一定程度上节省内存,使得程序更加高效运行。

因为我们每个变量只使用一次,所以可以直接使用匿名结构体。

1.6 运用联合体判断大小端

1.7 利用联合体打印存储的字节内容

既然可以判断大小端,那其实也可以直接把存储的情况打印出来!!这是一个很神奇的代码!

二、枚举类型

2.1 枚举类型的声明

枚举顾名思义就是⼀⼀列举。

把可能的取值⼀⼀列举。

⽐如我们现实⽣活中:

⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举

性别有:男、女、保密,也可以⼀⼀列举

⽉份有12个⽉,也可以⼀⼀列举

三原⾊,也是可以意义列举

{ }中是枚举类型的可能取值,也叫做枚举常量。

这些可能取值本身都是由值的,默认是从0开始依次递增1,当然我们在声明的时候也可以自己赋初值,但是定义完成之后,就不能在该类型的外部去修改了!!

2.2 枚举类型的优点

1、增加代码的可读性和可维护性

比如我们在实现游戏时常常会这样去写

此时如果不和菜单建立联系

我们并不能一下子就看出来case1和case0的含义,可读性较差,可如果在这边使用枚举类型,就可以增加代码的可读性,并且后期在维护的时候也方便。

2、 和#define定义的标识符⽐较枚举有类型检查,更加严谨。

#define定义的标识符是不过是一个符号,而枚举是一种类型,有类型检查写代码会更加严谨

3、 便于调试,预处理阶段会删除 #define 定义的符号

枚举类型在调试的时候会显示出成员名,但是#define就不会,标识符会直接替换成数字,后期如果需要调试找错误就不利于发现问题

4.、使⽤⽅便,⼀次可以定义多个常量

5.、枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

枚举有作用域的概念,在一个函数内部使用,出了函数就不能用了,但是#define定义的标识符没有作用域概念,他是一个全局都可以使用的常量。

2.3 枚举类型的使用

使用方法:使⽤枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?

在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐ 较严格。

相关文章:

C语言:自定义类型——联合和枚举

一、联合体 1.1 联合体类型的声明 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同的类型。 声明方式如下图: 那联合体和结构体究竟有什么区别呢?? 下面将重点讲解联合体的特点!&am…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户投票实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

如何实现一个两栏布局,右侧自适应?三栏布局中间自适应?

要实现一个两栏布局&#xff0c;右侧自适应的效果&#xff0c;可以使用 CSS 的 Flexbox 或 Grid 布局来实现。以下是使用 Flexbox 实现的示例&#xff1a; HTML 结构&#xff1a; htmlCopy Code<div class"container"><div class"left-column"&…...

004 Golang-channel-practice 左右括号匹配

第四题 左右括号打印 一个协程负责打印“&#xff08;”&#xff0c;一个协程负责打印“&#xff09;”&#xff0c;左右括号的数量要匹配。在这道题目里&#xff0c;我在main函数里进行了一个死循环。会产生一个随机数&#xff0c;随机数就是接下来要打印的左括号的数量。 例…...

MS2351M/MS2351D:RF 检测器/控制器

产品简述 MS2351M/MS2351D 是一款对数放大器芯片&#xff0c;主要用于接收 信号强度指示 (RSSI) 与 控 制 功 率 放 大 器 &#xff0c; 工 作 频 率 范 围 是 0.05GHz  4.0GHz &#xff0c;动态范围随信号频率不同可达 35dB 到 45dB 。 MS2351M/MS2351D 是电压响…...

vue中使用js-doc

安装依赖 安装vue-template-compiler npm install ​vue-template-compiler​ 安装minami npm install minami 安装js-doc npm install js-doc 根目录下创建 .jsdoc.conf.json 内容&#xff1a; {"tags": {"allowUnknownTags": true,// 指定所用词…...

Hive知识点

基本概念&#xff1a; 由Facebook开源&#xff0c;构建在Hadoop之上的数据仓库&#xff0c;数据计算是mapreduce&#xff0c;数据存储是HDFS 目的是构建面向分析的集成的数据环境&#xff0c;为企业提供决策支持 &#xff08;面向分析的存储系统&#xff09; 主要特征&…...

android自启动

Android 开机自动启动一个Service 附源码_watchdogservice-CSDN博客 执行 adb push 本地地址 目标地址 时遇到错误&#xff1a; adb: error: failed to copy app-release.apk to /system/app/app-release.apk: remote couldnt create file: Read-only file system 解决方案…...

cookie、Web Storage

前端知识汇编 1. cookie1.1 cookie的限制1.2 cookie的构成1.3 JavaScript中的cookie1.4 子cookie1.5 使用cookie的注意事项 2. Web Storage2.1 Storage类型2.2 sessionStorage对象2.3 localStorage对象2.4 存储事件2.5 限制 1. cookie cookie是客户端与服务器端进行会话时使用…...

【rk3568】01-环境搭建

文章目录 1.开发板介绍1.1相关资源&#xff1a;1.2接口布局1.3屏幕1.4核心板引脚可复用资源 2.环境搭建2.1安装依赖包2.2git配置2.3安装sdk2.4sdk介绍2.5sdk编译 3.镜像介绍 1.开发板介绍 开发板&#xff1a;atk-rk3568开发板 eMMC&#xff1a;64G LPDDR4&#xff1a;4G 显示屏…...

编程笔记 html5cssjs 036 CSS概述

编程笔记 html5&css&js 036 CSS概述 一、什么是 CSS?二、样式非常重要三、CSS 语法四、CSS 注释五、示例 CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式…...

Vue入门七(Vuex的使用|Vue-router|LocalStorage与SessionStorage和cookie的使用)

文章目录 一、Vuex1&#xff09;理解vuex2&#xff09;优点3&#xff09;何时使用&#xff1f;4&#xff09;使用步骤① 安装vuex② 注册vuex③ 引用vuex④ 创建仓库Store五个模块介绍 5&#xff09;基本使用 二、Vue-router三、LocalStorage与SessionStorage、cookie的使用 一…...

多级缓存架构(三)OpenResty Lua缓存

文章目录 一、nginx服务二、OpenResty服务1. 服务块定义2. 配置修改3. Lua程序编写4. 总结 三、运行四、测试五、高可用集群1. openresty2. tomcat 通过本文章&#xff0c;可以完成多级缓存架构中的Lua缓存。 一、nginx服务 在docker/docker-compose.yml中添加nginx服务块。…...

写点东西《Docker入门(上)》

写点东西《Docker入门&#xff08;上&#xff09;》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络&#xff1a; Docker 存储&#xff1a; Docker 是一个工具&#xff0c;允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…...

chatgpt实用技巧之二反问式提示

大家好&#xff0c;今天跟大家讲实用gpt的小技巧二、反问式提示 有时候不知道怎么给 GPT 提示词&#xff0c;这时候&#xff0c;就可以反问 GPT 如何更好地给提示词。如图片所示 更详细内容可以看下这篇&#xff1a; 按照 GPT 给出的&#xff1a;故事设定角色故事发展主题结局…...

【数据结构和算法】奇偶链表

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;分离节点后合并 三、代码 3.1 方法一&#xff1a;分离节点后合并 四、复杂度分…...

MVC框架

文章目录 JSP 和 ServletMVC 的演进1. JSP Model 12. JSP Model 23. MVC 的一般化4. MVC 的变体 总结 JSP 和 Servlet 如果你有使用 Java 作为主要语言开发网站的经历&#xff0c;那么你一定听过别人谈论 JSP 和 Servlet。其中&#xff0c;Servlet 指的是服务端的一种 Java 写…...

学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研

之前博客介绍了NeRF-SLAM&#xff0c;其中对于3D Gaussian Splatting没有太深入介绍。本博文对3D Gaussian Splatting相关的一些工作做调研。 学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客文章浏览阅读967次&#xff0c;点赞22次&#xff0…...

Github Copilot 的使用方法和快捷键

Github Copilot是一个基于人工智能技术的代码自动补全工具&#xff0c;它可以为开发者提供实时的代码建议和自动生成代码片段。本文将详细介绍如何安装、设置和使用Github Copilot&#xff0c;并提供一些常用的快捷键来提高开发效率。 1. 安装和设置 1.1 下载并安装VS Code …...

开源iMES工厂管家 - 详细安装部署指南(图解)- 全网独稿

目录 一、服务器环境: 二、部署构成总览: 三、下载 node-v16.17.1-win-x64:Index of /download/release/v16.17.1/ 四、绿色安装 node-v16.17.1-win-x64 五、配置环境变量 六、检查 node-v16.17.1-win-x64 是否成功 七、执行命令组,安装组库与各种依赖 vue3环境配置…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...