联合体和枚举<C语言>

导言

        在C语言中除了结构体外,联合体和枚举也是自定义类型,联合体主要用于节省空间,在同一块内存存储多种类型的数据,而枚举可以提高代码的可读性、可维护性。


联合体(union)

它还有个更容易理解的名字:“共用体”,它有多个成员,成员可以为不同类型,但是编译器只会给最大的成员分配内存空间,所有成员共用一块空间。

联合体的创建
//联合体的创建
union un {int x;int y;
};
int main() {union un tmp = { 0 };return 0;
}

 联合体的初始化

联合体的初始化只能对整个联合体进行初始化,因为所有联合成员共用一块内存,初始化后所有的成员都是这个值,不管成员类型是否一致。

联合体的访问与结构体一致,这里不再介绍

联合体的大小

联合体大小计算规则:

●联合体大小最少为最大成员的大小

●当最大成员的大小不为最大对齐数的整数倍时,联合体大小要对齐到最大对齐数的整数倍

示例:

 值得注意的是:在计算数组的对齐数时,与默认数比较的不是整个数组的大小,而是数组单个元素的大小。

联合体的运用

1.假如一家商店要进一批货,分别为书、卡牌、玩具。这三样物品都有公共属性和私有属性

公共属性:进货量、价格、生产年份

私有属性:

●书:作者、页数、版号

●卡牌:形状(圆或方)

●玩具:颜色、尺寸

使用结构体定义:

struct goods {//公共属性:进货量、价格、生产年份int count;int price;int year;//私有属性://书:作者、页数、版号char name[20];int pages;int vn;//卡牌:形状(圆或方)int shape;//玩具:颜色、尺寸char color[10];int size;};//占用空间60字节

使用联合体定义:

struct goods {//公共属性:进货量、价格、生产年份int count;int price;int year;//私有属性:union {struct {//书:作者、页数、版号char name[20];int pages;int vn;}book;struct {//卡牌:形状(圆或方)int shape;}card;struct {//玩具:颜色、尺寸char color[10];int size;}toy;}item;
};//占用空间40字节

 在这个例子中使用结构体占用了60字节,使用联合体却只用了40字节,第二种方法声明比较复杂,我们怎么来对它进行初始化呢?

struct goods {//公共属性:进货量、价格、生产年份int count;int price;int year;//私有属性:union {struct {//书:作者、页数、版号char name[20];int pages;int vn;}book;struct {//卡牌:形状(圆或方)int shape;}card;struct {//玩具:颜色、尺寸char color[10];int size;}toy;}item;
};//占用空间40字节
int main() {struct goods goods_1 = { 10,30,2005,.item.book = {"yuhua",200,1998} };//这里初始化了结构体goods中,公共属性中的进货量、价格、生产年份,// 以及联合体item中的结构体book三个成员:作者、页数、版号return 0;
}

2.通过联合体其数据类型互换的特性,完成对大小端字节序的判断

union un {char a;int b;//定义一个拥有char型和int型的联合体,来观察其大小端字节序
};
int main() {union un un1 = { 0x11223344 };//存入16进制数0x11223344来观察,小端存储:0X44332211、大端存储:0X11223344printf("%#X", un1.a);//使用联合体成员char a,来打印第一个字节内容来观察大小端return 0;
}

运行结果:

小端存储。


枚举(enum)

枚举顾名思义:一一列举。

我们可以为一组数值定义相同类型的符号名(枚举常量),如:

周一到周日、一月到十二月、三原色等。

枚举的创建
//枚举的创建
enum en {monday,//注意枚举常量后面是“,”逗号,从0开始tuesday,wednesday,thursday,friday,saturday,sunday,
};

 枚举常量在创建时是有初值的,默认从0开始,步长为1.

也可更改:

枚举的声明以及使用

 

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

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

相关文章

Rust-08-枚举和模式匹配

枚举类 结构体给予你将字段和数据聚合在一起的方法,像 Rectangle 结构体有 width 和 height 两 个字段。而枚举给予你将一个值成为一个集合之一的方法。比如,我们想让 Rectangle 是一 些形状的集合,包含 Circle 和 Triangle 。为了做到这个&…

硬件工程师需要掌握的工具

软件工具: 一、常用画图软件 1、AD/protel 简单好学,在低端市场使用的比较多。建议刚进入硬件工程师岗位或者大学生使用。 2、Candence/allegro Candence画复杂的板子相对更加有优势。但是学习难度比较高,但是如果学会AD后,可…

MSPM0——GPIO的使用

在dl_gpio.h库函数文件中,有三个函数可以控制引脚状态。 __STATIC_INLINE void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins) 该函数为控制引脚输出高电平,按照本例程中LED的引脚,则可以写为 DL_GPIO_setPins(LED1_PORT,LED1_PIN_14_…

适用于电脑的 5 大嗨格式数据恢复替代方案

嗨格式数据恢复是有一定知名度的 Windows 和 Mac 恢复程序,旨在恢复格式化、删除和丢失的图片、视频和音频。该应用程序支持多种文件格式以及相机 RAW 图像。最好的部分?它的预览功能可以在恢复照片和其他媒体文件之前检查和验证它​​们——这可以节省大…

番外篇 | 超越ReLU却鲜为人知,YOLOv5改进之崛起的最佳激活函数GELU!

前言:Hello大家好,我是小哥谈。作为决定神经网络是否传递信息的「开关」,激活函数对于神经网络而言至关重要。不过今天被人们普遍采用的ReLU真的是最高效的方法吗?最近在社交网络上,人们找到了一个看来更强大的激活函数:GELU,这种方法早在2016年即被人提出,然而其论文迄…

快排(快速排序)的递归与非递归实现(文末附完整代码)

快排有几种不同的写法,下面一一来介绍并实现。其中又分为递归和非递归的写法,但大体思路相同,只是代码实现略有不同。(注:文章中的完整代码中,Swap()函数均省略未写,记得自己补充) 递归写法 递归的写法类…

glm-4v-9b 部署

glm-4v-9b 模型文件地址 GLM-4 仓库文件地址 官方测试 硬件配置和系统要求 官方测试硬件信息: OS: Ubuntu 22.04Memory: 512G…

进程概念(二)

目录 进程优先级基本概念查看系统进程PRI and NIPRI vs NI修改进程优先级的命令renice修改优先级进程其他概念 环境变量基本概念查看环境变量方法常见环境变量PATHHOMESHELL 查看环境变量环境变量相关的命令 环境变量特征命令行参数main函数中的俩个参数 argc argvmain函数的第…

LabVIEW缝缺陷图像标注库

LabVIEW缝缺陷图像标注库 开发了一个基于LabVIEW平台构建的船舶焊缝缺陷图像标注库。该库旨在通过高效和简洁的方式处理和标注船舶焊缝缺陷图像,提高缺陷识别的准确性和效率,进而保障船舶的结构安全。 项目背景 在船舶制造过程中,焊接质量…

人工智能和物联网如何结合

欢迎来到 Papicatch的博客 文章目录 🍉引言 🍉AI与IoT的结合方式 🍈数据处理和分析 🍍实例 🍈边缘计算 🍍实例 🍈自动化和自主操作 🍍实例 🍈安全和隐私保护 &…

YOLOv10 超详细解析 | 网络结构、训练策略、论文解读

网络结构 1. Backbone 2. Head 3. 说明 网络结构按 YOLOv10m 绘制,不同 scale 的模型在结构上略有不同,而不是像 YOLOv8 一样仅调整 depth 和 width。Head 有部分后续计算与 YOLOv8 完全相同,上图省略,具体请看此文。YOLOv10 整…

Vue3+Vite报错:vite忽略.vue扩展名 Failed to resolve import ..... Does the file exist?

Vue3Vite报错:vite忽略.vue扩展名 Failed to resolve import … Does the file exist? 先看报错: 分析原因 原因是我们没有写后缀名 建议你在你的vite.config.js中加上如下配置 import { defineConfig } from "vite"; import vue from &qu…

人工智能程序员应该有什么职业素养?

人工智能程序员应该有什么职业素养? 面向企业需求去学习AI必备技能实战能力实战能力提升策略 面向企业需求去学习 如果想要应聘AI相关的岗位,就需要知道HR和管理层在招聘时需要考察些什么,面向招聘的需求去学习就能具备AI程序员该有的职业素…

怀庄之醉酱香白酒的历史(一)——茅台镇的地理位置与名称由来

茅台镇,这个黔北的历史名镇,自古以来就有着“川盐走贵州,秦商聚茅台”的繁荣景象。它坐落于仁怀市城西13公里之处的赤水河东岸,具体地理位置是东经10622′,北纬2751′。这个镇子依山傍水,位于寒婆岭下&…

C++中的宏定义

目录 摘要 1. 条件编译 2. 宏函数 3. 字符串化和连接 4. 可变参数宏 5. 宏和模板结合使用 6. 防止重复包含 7. 复杂宏定义 8. 安全的宏函数 9. 内联宏与内联函数的比较 总结 摘要 C中的宏定义(Macros)是预处理器的一部分,可以在编…

RJ45 PCB布线

RJ45底盘接地和数字地通过一个1M欧姆的电阻和一个0.1uF的去耦电容隔离。其底盘接地和数字地的间距,必须比60mil宽。如图11及图12所示。 图11 典型变压器集成单RJ45的机箱/数字地平面 图12 典型RJ45和变压器分开的机箱/数字地平面https://www.bilibili.com/read/…

主从式光伏并网发电系统体系结构

通过控制组协同开关,来动态滴决定在不同的外部环境下光伏并网系统的结构,以期望达到最佳的光伏能量利用效率。 当外部光照强度较低时,控制组协同开关使所有的光伏组件只和一个并网逆变器相连,构成为集中式结构,从而克…

flink 作业动态维护更新,不重启flink,不提交作业

Flink任务实时获取并更新规则_flink任务流实时变更-CSDN博客 一种动态更新flink任务配置的方法_flink 数据源 动态更新-CSDN博客 Flink CEP在实时风控场景的落地与优化 最佳实践 - 在SQL任务中使用Flink CEP - 《实时计算用户手册-v4.5.0》 Flink SQL CEP详解-CSDN博客 如…

Java——ArrayList与顺序表

一、线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就是连续的一条直…

供应链经理面试题

供应链经理面试题通常会涉及对供应链管理的基本理解、工作经验、解决问题的能力以及团队协作等多个方面。 请简要介绍一下你在供应链管理领域的工作经验和取得的成绩。你如何定义供应链管理?它在企业中的作用是什么?你认为供应链经理最重要的职责是什么…