C语言联合体详解

下午好诶,今天小眼神给大家带来一篇C语言联合体详解的文章~

目录

联合体

1.  联合体类型的声明

 2.  联合体的特点

代码一: 

代码二:

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

​编辑4.  联合体大小的计算 

 5.  联合体的优点

联合体

1.  联合体类型的声明

与我们之前学的结构体很相似,联合体也是由一个或者多个成员组成的,并且成员之间的类型可以不同

联合体与结构体不同的是,联合体的组成成员所占用内存空间是同一块内存空间,并且,编译器只为最大的成员分配足够多的内存空间,所以联合体也叫做:共用体

若是

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

#include<stdio.h>
union Un
{
	char a;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("%d\n", sizeof(un));//4
	return 0;
}

 输出结果: 4

 如果是结构体,这里应该输出结果为8,但结构体内成员共用一块空间,只为最大的成员分配足够多的内存空间,所以这里只给 i 分配了4个空间,a存储在 i 的空间中。

 2.  联合体的特点

联合体成员共用一个内存空间,那么一定要保证最大的成员要装下,所以,这样的联合变量的大小,至少是最大成员的大小(因为联合体至少有能力保存最大的那个成员)

代码一: 

#include<stdio.h>
union Un
{
	char a;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("%d\n", sizeof(un));//4
	printf("%d\n", sizeof(un.a));//1
	printf("%d\n", sizeof(un.i));//4
	printf("%p\n", &un);
	printf("%p\n", &(un.a));
	printf("%p\n", &(un.i));
	return 0;
}

输出结果:

4
1
4
0078FDF4
0078FDF4
0078FDF4

那么我们可以看到,联合体及其各个成员们的地址都是一样的,那么我们可以推测,是否所有的非最大成员都在首地址处存放呢?

代码二:

#include<stdio.h>
union Un
{
	char a;
	int i;
};
int main()
{
	union Un un = { 0 };
	un.i = 0x11223344;
	un.a = 0x55;
	printf("%x\n", un.i);
	return 0;
}

让我们调试上述代码来看看: 


通过内存监视,我们可以发现:的第四个字节内容被修改成 55 了,我们可以分析出以下 un 的内存布局图:

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

union S
{
	char a;
	int i;
};
struct S s = { 0 };

struct Un
{
	char a;
	int i;
};
struct Un un = { 0 };

相同成员的情况下,结构体和联合体的内存分布情况:

 结构体和联合体的内存对比

4.  联合体大小的计算 

1.  联合体的大小至少是成员的大小

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

#include<stdio.h>
union S1
{
	char a[5];
	int i;
};
union S2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union S1));
	printf("%d\n", sizeof(union S2));
	return 0;
}

 5.  联合体的优点

使用联合体是可以节省空间的,例如我们要统计三种商品数据:图书,杯子,衬衫。

每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

图书:书名、作者、页数

杯子:设计

衬衫:设计、可选颜色、可选尺寸

 如果我们用结构体来写的话:

#include<stdio.h>
struct my_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;//尺寸
};

上述结构设计简单用起来方便,但结构的设计中包含了所有商品的各种属性,这样会使得结构体的大小过大,很浪费内存。因为对于各自商品,只有部分属性信息是常用的:

商品是图书,就不需要design、colors、sizes。

所以,我们可以把公共属性单独写出来,用联合体把各种商品本身的属性括起来,这样可以在一定程度上节省内存

#include<stdio.h>
struct my_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
		{
			int colors;//颜色
			int sizes;//尺寸
		}shirt;

	}item;
};

 感谢阅读本篇文章

 希望能对您解题有所帮助,记得点赞关注收藏 

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

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

相关文章

干货:html中的标签属性大全25个,收藏起来吧。

<meta> 元素是 HTML 中的一个标签&#xff0c;用于提供关于文档的元数据信息。它通常位于 <head> 标中&#xff0c;不会直接在页面上显示内容&#xff0c;而是用于告诉浏览器和搜索引擎一些关于页面的信息。 <meta charset"字符编码">&#xff1a;…

【算法入门-Python】02_递归

一、递归 递归的两个特点&#xff1a;调用自身&#xff1b;结束条件。 def func1(x):print(x)func1(x-1)没有结束条件&#xff0c;si递归。不是递归。 def func2(x)&#xff1a;if x > 0:print(x)func2(x1)递归调用的x1&#xff0c;没有结束条件。不是递归 def func3(x)…

【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code,开发必备

0. 前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;远程连接 Linux 服务器进行开发和维护已成为一种常态。对于使用Windows系统的开发者来说&#xff0c;掌握如何通过 SSH 安全地连接到 Linux 服务器&#xff0c;并利用 VS Code 编辑器进行开发&#xff0c;是一项必备…

Unix 进程基本信息

目录 一、程序执行流程二、进程的执行状态三、进程信息记录3.1 proc结构体3.2 user结构体 四、内存分配4.1 代码段代码段如何管理&#xff1f;4.2 数据段4.3 虚拟地址空间4.4 交换地址APR构成APR数量APR切换 内容来源&#xff1a;《Unix内核源码剖析》 一、程序执行流程 为程序…

python学习笔记(集合)

知识点思维导图 # 直接使用{}进行创建 s{10,20,30,40} print(s)# 使用内置函数set()创建 sset() print(s)# 创建一个空的{}默认是字典类型 s{} print(s,type(s))sset(helloworld) print(s) sset([10,20,30]) print(s) s1set(range(1,10)) print(s1)print(max:,max(s1)) print(m…

Java web第四次作业

要求&#xff1a;读取xml文件并在页面中显示出来。 采用三种方式实现&#xff0c;并体会其中的原理&#xff1a; 1.常规方式&#xff0c;controlller控制器不分层 代码&#xff1a;RestController public class PoetController { RequestMapping("/listPoet") pu…

STL::string简单介绍

目录 1、什么是STL STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器 推荐文档&#xff08;必须学会看文档&#xff09; 2、string常用接口 a、初始化 1、什么是STL 标准模板库 STL&#xff08;Standard Template Library&#xff09;&#xff0c;主要是数据结构…

如何带好一个开发小团队?

俗话说&#xff1a;授人以鱼不如授人以渔&#xff0c;这句话强调的是教会别人解决问题的方法比单纯给予一次性帮助更有价值。提倡教育和培养团队成员&#xff0c;使其具备自我解决问题的能力。带领一个开发小团队需要综合考虑管理、沟通和技术能力等方面。以下是一些建议&#…

2024年电子商务与大数据经济国际会议 (EBDE 2024)

2024年电子商务与大数据经济国际会议 (EBDE 2024) 2024 International Conference on E-commerce and Big Data Economy 【会议简介】 2024年电子商务与大数据经济国际会议即将在厦门召开。本次会议旨在汇聚全球电子商务与大数据经济领域的专家学者&#xff0c;共同探讨电子商务…

实验五 Spark SQL编程初级实践

Spark SQL编程初级实践 Spark SQL基本操作 将下列JSON格式数据复制到Linux系统中&#xff0c;并保存命名为employee.json。 { "id":1 , "name":" Ella" , "age":36 } { "id":2, "name":"Bob","a…

STM32学习和实践笔记(21):定时器中断实验

通用定时器配置步骤如下&#xff1a; 第一步&#xff1a;使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟 第二步&#xff1a;初始化定时器参数,包含自动重装值&#xff0c;分频系数&#xff0c;计数方式等 voidTIM_TimeBaseInit(TIM_T…

C++编译器如何实现 const(常量)?

C编译器如何实现 const&#xff08;常量&#xff09;&#xff1f; 表面上看&#xff0c;我们在讨论 “编译器怎么保证一个常量不会被程序员强行改变呢&#xff1f;”&#xff1b;其实&#xff0c;我们说的是&#xff1a;如果你表明自己就是要强行修改一个常量&#xff0c;那么…

每日一题:托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同&#xff0c;那么这个矩阵是 托普利茨矩阵 。 示例 1&#xff1a; 输入&#xff1a;matrix…

【原创教程】EPLAN如何制作专属的封面

想要给EPLAN制作专属封面吗?没问题,我来给你支个招。在EPLAN设计电气图纸时,封面就是第一印象,得好好弄。咱们以口罩机项目为例,来看看怎么做吧! 首先,得新建个封面。在项目属性里找到表格名称,点那个数值下拉菜单,选择“查找”。在弹出的表格里挑个你喜欢的模版,点击…

【IC设计】边沿检测电路(上升沿、下降沿、双沿,附带源代码和仿真波形)

文章目录 边沿检测电路的概念上升沿检测电路下降沿检测电路双边沿检测电路代码和仿真RTL代码Testbench代码仿真波形 参考资料 边沿检测电路的概念 边沿检测指的是检测一个信号的上升沿或者下降沿&#xff0c;如果发现了信号的上升沿或下降沿&#xff0c;则给出一个信号指示出来…

OurBMC开源大赛高校获奖队伍专访来啦!

精彩纷呈的 OurBMC 开源大赛已告一段落&#xff0c;经历为期四个月的实战&#xff0c;各个参赛队伍也积淀了丰富的实践经验与参赛心得。本期&#xff0c;社区特别邀请 OurBMC 开源大赛获奖高校团队分享「走进OurBMC开源大赛&#xff0c;共同践行开放包容、共创共赢的开源精神」…

【春秋云境】文件上传漏洞合集

CVE-2022-30887 1.题目简介 2.CVE-2022-30887简介 使用工具&#xff1a; 蚁剑 burpsuite 一句话木马 3.渗透测试 输入用户名密码进行抓包 猜测账号密码 无有用信息&#xff0c;根据页面现有信息找到作者邮箱&#xff1a; mayuri.infospacegmail.com&#xff0c;猜测密码为&a…

每日一题:跳跃游戏II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

YOLOv3没有比这详细的了吧

YOLOv3&#xff1a;目标检测基于YOLOv2的改进 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列以其出色的性能和速度而闻名。YOLOv3作为该系列的第三个版本&#xff0c;不仅继承了前身YOLOv2的优势&#xff0c;还在多个方面进行了创新和改进。…

机器学习理论基础—支持向量机的推导(一)

机器学习理论基础—支持向量机的推导 算法原理 SVM:从几何角度&#xff0c;对于线性可分数据集&#xff0c;支持向量机就是找距离正负样本都最远的超平面&#xff0c;相比于感知机&#xff0c;其解是唯一的&#xff0c;且不偏不倚&#xff0c;泛化性能更好。 超平面 n维空间…