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

联合体和枚举<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.

也可更改:

枚举的声明以及使用

 

相关文章:

  • 卡尔曼滤波器例子
  • MathType7.8永久破解版下载 让数学学习变得简单有趣!
  • 为什么Kubernetes(K8S)弃用Docker:深度解析与未来展望
  • 微信小程序学习笔记(4)
  • 【AI 高效问答系统】机器阅读理解实战内容
  • Vue3+TS 开发 Google 浏览器插件模板
  • 计算机网络 —— 网络层 (路由协议)
  • 计算机网络 ——网络层(IPv4地址)
  • ThreadCache线程缓存
  • linux install cmake3.22
  • Apache POI(使用Java读写Excel表格数据)
  • Flutter 中的 ListWheelViewport 小部件:全面指南
  • Docker安装、使用,容器化部署springboot项目
  • 机器学习——卷积神经网络
  • 【ARM Cache 系列文章 2.1 -- Cache PoP 及 PoDP 介绍】
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • create-react-app项目添加less配置
  • css系列之关于字体的事
  • HTTP请求重发
  • java多线程
  • JAVA之继承和多态
  • leetcode98. Validate Binary Search Tree
  • mysql中InnoDB引擎中页的概念
  • tab.js分享及浏览器兼容性问题汇总
  • Vue UI框架库开发介绍
  • Web设计流程优化:网页效果图设计新思路
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 解决iview多表头动态更改列元素发生的错误
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端临床手札——文件上传
  • 如何学习JavaEE,项目又该如何做?
  • 入手阿里云新服务器的部署NODE
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用API自动生成工具优化前端工作流
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 项目实战-Api的解决方案
  • 与 ConTeXt MkIV 官方文档的接驳
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • #if和#ifdef区别
  • $$$$GB2312-80区位编码表$$$$
  • (4)logging(日志模块)
  • (poj1.2.1)1970(筛选法模拟)
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (十六)一篇文章学会Java的常用API
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (杂交版)植物大战僵尸
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Framework 4.6.2改进了WPF和安全性