联合体类型

 结构体我们已经介绍在 自定义类型:结构体 中,今天我们来介绍另一种 自定义类型:联合体


目录

1.联合体的声明

2.联合体的特点

3.联合体大小的计算

4.联合体的应用

5.联合体的一个练习


1.联合体的声明

联合体与结构体类似,它也是一种自定义类型,且也可以存在不同的多种成员。

声明联合体类型的方式也与结构体一样,只是使用的关键字不同,需要用到:union  关键字

union S {
	char c1;
	int i;
};

2.联合体的特点

1.联合体的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

2.联合体特殊就在于成员之间的内存使用是重叠的,即公用一块空间。

union S {
	char c1;
	int i;
};
int main() {

	//联合变量的定义
	union S un = { 0 };
	// 下⾯输出的结果是⼀样的吗?
	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c1));
	printf("%p\n", &un);
	return 0;
}

输出结果:

0073F874
0073F874
0073F874

内存使用情况

c1存放在了数据起始点,且当你给 int i 赋值完成后,你再对char c1进行修改,那么int i的值也会随之改变

3.联合体大小的计算

  • 联合体大小,至少是最大成员的大小
  • 当联合体大小不足最大对齐数的整数倍时 ,它的大小就要对齐到最大对齐数的整数倍大小
union S {
	short c1[7];  //对齐数为2
	int i;       //对齐数为4(结构体大小应是它的整数倍)
};
int main() {

	union S un = { 0 };
	
	printf("%d\n", sizeof(un)); 
}

输出结果:16 

short c1 [7] 的大小为14,也就是说这个联合体大小至少为14,又由于14不是最大对齐数4的整数倍,所以它的大小应该对齐为16

4.联合体的应用

联合体对比结构体的优势就是节省空间

下面这个例子就可以很好的体现出来:

比如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
| 图书:书名、作者、⻚数
| 杯⼦:设计
| 衬衫:设计、可选颜⾊、可选尺⼨

当我们想省事就会写出以下代码:

struct gift_list
{
	//公共属性
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

	//特殊属性
	char title[20];//书名
	char author[20];//作者
	int num_pages;//⻚数

	char design[30];//设计
	int colors;//颜⾊
	int sizes;//尺⼨
};

这样的结构体写起来很简单,使用起来也很方便,但是就是有点浪费内存空间

当我们的礼品是书时 ,杯子和衬衫的特殊属性就浪费了

对于礼品清单而言,需要一种物品属性时,另外俩种就不需要了,利用联合体我们就可以写出:

struct gift_list
{
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

	union {
		struct
		{
			char title[20];//书名
			char author[20];//作者
			int num_pages;//⻚数
		}book;
		struct
		{
			char design[30];//设计
		}mug;
		struct
		{
			char design[30];//设计
			int colors;//颜⾊
			int sizes;//尺⼨
		}shirt;
	}item;
};

把每种物品特殊的属性整合起来放在联合体之中,这样就可以做到,你用一种物品的特殊属性时,另外两种物品的特殊属性不占用内存空间

5.联合体的一个练习

在数据在内存中的存储(1)中我们讲过一个小练习:一个程序判断大小端:

int check_sys() {
	int a = 1;           //a的十六进制为:0x00 00 00 01

	char* p = (char*)&a; //指向低地址,也是数据读取的开始

	return *p;
}
int main() {
	
	int p = check_sys();
	if (p == 1) {       //低地址---------->高地址
		printf("是小端");//   01 00 00 00
	}                    //低位-------->高位


	else {               //低地址---------->高地址        
		printf("是大端");//   00 00 00 01
	}                    //低位-------- > 高位

	return 0;
}

那么利用联合体的我们该怎么做到呢?

int check_sys() {
	union S {
		int i;
		char c1;
	}un;
	un.i = 1;

	return un.c1;  //返回1是⼩端,返回0是⼤端
}
int main() {
	
	int p = check_sys();
	if (p == 1) {       //低地址---------->高地址
		printf("是小端");//   01 00 00 00
	}                    //低位-------->高位


	else {               //低地址---------->高地址        
		printf("是大端");//   00 00 00 01
	}                    //低位-------- > 高位

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webpack练习之手写loader

手写一个style-loader来把样式文件插入head里面,准备工作 vue webpack就自己弄了,webpack的一些配置也自己配置好 一、创建index.css文件 .box{width: 100px;height: 100px;background-color: red; }然后在vue的main.js文件中引入它 二、创建自定义l…

深度学习知识【CSPNet网络详解】

CSPNet的贡献 1.增强了CNN的学习能力,能够在轻量化的同时保持准确性。 2.降低计算瓶颈。 3.降低内存成本。 CSPNet介绍 在神经网络推理过程中计算量过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中&#xff0c…

2024水业大会|水会|水务投资与EOD模式论坛

论坛召集人:邹权 上海大学研究员 丁贞玉 生态环境部环境规划院研究员(拟请) EOD模式:生态环境导向的开发模式 《生态环保金融支持项目储备库入库指南(试行)》文件精神与上述逻辑并不完全一致。《指南》提出,EOD模…

阿里云服务器 -- 为网站配置域名

思考:小云已经成功的通过云服务器ECS完成了网站的架设和测试工作,那么是否可以让他的网站直接对外提供服务? 小云:我已经成功的通过云服务器ECS完成了网站的架设和测试,那么是不是就可以正式对所有用户开放我的网站了…

MySql实战--行锁功过:怎么减少行锁对性能的影响

在上一篇文章中,我跟你介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁&#xf…

国产半导体公司

1、移远通信---通信模组 物联网解决方案供应商,可提供完备的IoT产品和服务,涵盖蜂窝模组(5G/4G/3G/2G/LPWA)、车载前装模组、智能模组(5G/4G/边缘计算)、短距离通信模组(Wi-Fi&BT)、GNSS定位模组、卫星通信模组、天线等硬件产…

发送请求- header配置

请求头里是客户端的要求,把你的诉求告诉服务端,服务端按照你的要求返回数据 , 请求header需要严格全配置,把请求header全部传入,不能频繁访问,让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

如何备份和恢复微信、企业微信的数据文件

备份和恢复微信、企业微信的数据文件,特别是聊天记录和微盘中的文件,可以通过以下方式进行: 备份微信个人版数据: 聊天记录备份: 目前微信客户端自身并不直接支持导出聊天记录至电脑查看,但可以通过手机微…

Clip Converter - 视频在线下载方法

Clip Converter - 视频在线下载方法 1. Video URL to Download2. Continue3. StartReferences YT to MP4 & MP3 Converter! https://www.clipconverter.cc/ Clip Converter is a free online media conversion application, which allows you to reocord, convert and do…

Go语言学习Day3:数据类型、运算符与流程控制

名人说:莫愁千里路,自有到来风。 ——钱珝 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、数据类型①布尔类型②整型③浮点型④string⑤类型转换 2、运算符①算术运算符②逻辑运算符③关…

FPGA内部资源介绍(1)-逻辑资源块

近期有许多小伙伴私信小编,希望小编出一些FPGA基础知识,能对FPGA有初步的认识。小编立马奋笔疾书,熬夜整理了一些学习FPGA必备的基础知识,双手呈上~~,每天一个干货,一星期带你入门FPGA! 敲黑板…

如何查询电脑是否被锁定了IP地址?锁定IP会出现什么问题?

前言 电脑刚到手的时候,基本上是通过路由器DHCP进行IP分配的。路由器DHCP分配IP给电脑的好处是网络不会出现IP冲突,网络能正常使用。 有些电脑可能在DHCP自动获取IP时出现错误,所以小伙伴就会通过手动设置IP让电脑可以正常上网。 这样的操…

springboot企业级抽奖项目业务四(缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

扫描电子显微镜如何对焦

扫描电子显微镜&#xff08;SEM&#xff09;的对焦过程是确保获得清晰、高分辨率图像的关键步骤。与传统光学显微镜相比&#xff0c;SEM使用电子束来照射样品&#xff0c;并通过检测样品发射的二次电子或背散射电子来生成图像。因此&#xff0c;对焦方法和原理也有所不同。以下…

模板设计模式经典案例

模板设计模式讲究的是将不变的设置为基类&#xff0c;将变的设置为虚函数来让子类实现。下面就以这样的写下模板设计模式的例子。 例子场景 一个工程步骤分为step1,step2&#xff0c;其中step1由总工程指定&#xff0c;step2由子工程指定&#xff0c;最后由一个函数串起来&am…

python 蓝桥杯之枚举、尺取法

文章目录 幸运数字组合型枚举排列型枚举python 排列函数子集尺取法 幸运数字 对于该题的思路&#xff1a;我们可以采用直接暴力枚举的方法 幸运数字就是 3 i 3^i 3i 5 j 5^j 5j 7 k 7^k 7k 的形式&#xff0c;那么我们就确定一个终极范围&#xff0c;直接用三层循环来遍历即可…

ruoyi-nbcio-plus基于vue3的flowable任务切换的主文件ElementTask.vue的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Linux:Jenkins全自动持续集成持续部署(4)

在上一章部署好了之后&#xff0c;还需要点击一下才能进行部署&#xff0c;本章的效果是&#xff1a;当gitlab上的代码发生了变化后&#xff0c;我们不需要做任何事情不需要去点击构建按钮&#xff0c;Jenkins直接自动检测变化&#xff0c;然后自动去集成部署Linux&#xff1a;…

vue3路由代码示例

路由简单分三步吧 第一定义路由&#xff1a; 包括访问地址&#xff0c;对应组件 第二使用&#xff1a;在index.html中使用它 下面是代码示例&#xff1a; components/Person.vue <template><router-link to"/test/hello">跳转</router-link>&…

RocketMQ学习笔记:分布式事务

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、分布式事务的难题2、解决方式2.1、半事务消息和事务回查2.2、代码样例2.2.1、TransactionListener2.2.2、TransactionMQProducer2.2.3、MessageListenerConcurrently2.2.4、流程图 1、分布…