自定义类型联合体

news2024/11/27 16:36:48

目录

  • 联合体
    • 联合体类型的声明
    • 联合体的特点
    • 相同成员的结构体和联合体对比
    • 联合体大小的计算
    • 联合体的应用
    • 联合的一个练习

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐓🏀 python

联合体

联合体类型的声明

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

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。

所以联合体也叫:共用体

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

联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

我们来看一个代码

#include <stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//计算连个变量的⼤⼩
	printf("%d\n", sizeof(un));
	return 0;
}

我们知道char类型是占一个字节,int类型是占4个字节的,按理说联合体的大小应该至少是大于或等于5个字节才对,但是运行结果却恰恰相反
在这里插入图片描述
我们再回头看上面的一句话
在这里插入图片描述
编译器只为最大的联合体成员分配足够的内存空间,那么这里的最大的成员就应该是int类型

所以联合体的内存大小就是int类型的大小,而char类型就是和int类型共用那4个字节的内存

为了更深入的了解联合体和联合体成员的内存是怎样分配的,我们来看下一段代码

#include <stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//计算连个变量的⼤⼩
	printf("%p\n", &un);
	printf("%p\n", &(un.c));
	printf("%p\n", &(un.i));
	return 0;
}

在这里插入图片描述
我们发现结果是一模一样的,我们可以推测当int i的第一个字节是属于char c的,所以我们取地址c就是取地址i的第一个字节

在这里插入图片描述
而联合体又叫共用体,说明我们只要改变其中任意一个成员,那其他成员也是会受到影响的

联合体也是可以匿名的

union 
{
	char c;
	int i;
}u;

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

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

//结构体
struct S
{
	char c;
	int i;
};
struct S s = { 0 };
//联合体
union Un
{
	char c;
	int i;
};
union Un un = { 0 };

联合体大小的计算

联合的大小至少是最大成员的大小

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

下面会涉及到内存对齐
可以先看一下我之前写的一篇文章自定义类型结构体(中)

#include <stdio.h>
union Un1
{
	char c[5];//大小5
	int i;//大小4
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	//下⾯输出的结果是什么?
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

在这里插入图片描述
对于un1,char c[5]其实相当于放了5个char类型的变量,每个变量只占一个字节,而int i是占的4个字节,因此最大对齐数的整数倍数应该是4,最后还得浪费3个字节变成8个字节才行

而un2, short c[7]中是相当于放了7个short类型的变量,每个变量是2个字节,而int i是4个字节,所以最大对齐数是4,因此最后需要浪费两个字节将14变成16才可以

使用联合体是可以节省空间的,举例:
比如,我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息

图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸

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;
};

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

当我们需要用到书的信息时,我们只需要用item.book就可以查询,其他的也是类似的

所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存

联合的一个练习

写一个程序,判断当前机器是大端?还是小端?

int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
}

在这里插入图片描述

因为char c和int i是共用内存的,而且char c是占的第一个字节,所以我们只需要看c最后的值是多少就可以判断编译器是大端存储还是小端存储

在这里插入图片描述

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

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

相关文章

破解密码 LLM(代码LLM如何从 RNN 发展到 Transformer)

舒巴姆阿加瓦尔 一、说明 近年来&#xff0c;随着 Transformer 的引入&#xff0c;语言模型发生了显着的演变&#xff0c;它彻底改变了我们执行日常任务的方式&#xff0c;例如编写电子邮件、创建文档、搜索网络甚至编码方式。随着研究人员在代码智能任务中应用大型语言模型&am…

4K Video Downloader Pro v4.28.0(视频下载器)

4K Video Downloader Pro是一款专业的视频下载软件&#xff0c;支持从YouTube、Vimeo、Facebook、Instagram、TikTok等主流视频网站下载高质量的4K、HD和普通视频。它的操作流程简单&#xff0c;只需复制视频链接并粘贴到软件中即可开始下载。此外&#xff0c;该软件还提供了多…

校园招聘系统

校园管理系统 公共模块学生端游客端企业联系人端校内管理员端超级管理员端企业端 公共模块 登录 用户可以通过验证码、账号密码进行登录。 个人中心 学生端 学生主要为查看招聘信息以及投递等。 首页 简历详情投递 双选会公司详情 公告通知 学生端主要为这些等等&#xf…

线扫相机-TEK(埃科)相机平场矫正详细步骤

采集卡模式&#xff1a; 现场要求 (1) 采集卡连续采集相机图像&#xff0c;并正常显示。 (2) 光源控制在正常工作亮度&#xff0c;使画面亮度不要过低也不要饱和。 (3) 调整相机使画面偏离成像位置&#xff0c;形成虚焦。 (4) 相机拍摄物面使用白纸&#xff0c;调节曝光时间使整…

【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)

文章目录 前言一、Counter1.1 子组件1.2 接口1.3 属性1.4 事件 1.5 示例代码二、Flex弹性布局到底是什么意思&#xff1f; 2.1 权限列表2.2 子组件2.3 接口参数 2.4 示例代码示例代码1示例代码2 总结 前言 Counter容器组件&#xff1a;计数器组件&#xff0c;提供相应的增加或…

基础课21——知识库管理

1.知识库的概念、特点与功能 智能客服中的知识库是一个以知识为基础的系统&#xff0c;可以明确地表达与实际问题相对应的知识&#xff0c;并构成相对独立的程序行为主体&#xff0c;有利于有效、准确地解决实际问题。它储存着机器人对所有信息的认知概念和理解&#xff0c;这…

【排序算法】 快速排序(快排)!图解+实现详解!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️快速排序的概念☁️快速排序的由来☁️快速排序的思想☁️快速排序的实…

网络运维Day02

文章目录 实验环境Linux系统简介Linux发行版RHEL与CentOS国产操作系统 安装CentOS7.9步骤一&#xff1a;虚拟硬件步骤二&#xff1a;为虚拟机安装操作系统为root设置密码首次初始化虚拟机 登录操作系统系统偏好设置 快照LINUX目录结构常见目录及其作用 LINUX磁盘表示方法LINUX中…

Linux常用命令——chage命令

在线Linux命令查询工具 chage 修改帐号和密码的有效期限 补充说明 chage命令是用来修改帐号和密码的有效期限。 语法 chage [选项] 用户名选项 -m&#xff1a;密码可更改的最小天数。为零时代表任何时候都可以更改密码。 -M&#xff1a;密码保持有效的最大天数。 -w&…

毅速丨3D打印在压铸模上大有所为

压铸模是压铸件成型不可缺少的工具。它的作用是将液态的金属或合金浇入到预先准备好的型腔中&#xff0c;并在压力的作用下凝固、成形。3D打印技术在压铸模上的使用&#xff0c;尤其是随形水路的应用&#xff0c;将大幅度提升制造效率。 在传统的压铸模制造中&#xff0c;水路的…

树结构及其算法-二叉排序树

目录 树结构及其算法-二叉排序树 C代码 树结构及其算法-二叉排序树 事实上&#xff0c;二叉树是一种很好的排序应用模式&#xff0c;因为在建立二叉树的同时&#xff0c;数据已经经过初步的比较&#xff0c;并按照二叉树的建立规则来存放数据&#xff0c;规则如下&#xff1…

Linux shell编程学习笔记21:用select in循环语句打造菜单

一、select in循环语句的功能 Linux shell脚本编程提供了select in语句&#xff0c;这是 Shell 独有的一种循环语句&#xff0c;非常适合终端&#xff08;Terminal&#xff09;这样的交互场景&#xff0c;它可以根据用户的设置显示出带编号的菜单&#xff0c;用户通过输入不同…

Draft-P802.11be-D3.2协议学习__$9-Frame-Format__$9.3.1.22-Trigger-frame-format

Draft-P802.11be-D3.2协议学习__$9-Frame-Format__$9.3.1.22-Trigger-frame-format 9.3.1.22.1 Genreal9.3.1.22.2 Common Info field9.3.1.22.3 Special User Info field9.3.1.22.4 HE variant User Info field9.3.1.22.5 EHT variant User Info field9.3.1.22.6 Basic Trigge…

关于JADX和JEB的小问题

关于JADX和JEB的小问题 很久没水过技术文啦&#xff0c;最近也刚好遇到点小问题&#xff0c;特此记录 第一个问题 在处理app加密逻辑的时候一直拿不到正确的密文&#xff0c;反复看了反编译出来的代码&#xff08;如下图&#xff09; public static string n(String str, Stri…

提升之做事方法

前言&#xff1a;在工作中&#xff0c;做事需要有一套方法&#xff0c;同样的一件事&#xff0c;不同的人去做&#xff0c;就能看到能力的差别&#xff0c;会产生不同的结果。那如何在工作中&#xff0c;提升自己做事的能力&#xff1f; 目录 闭环思维 做事方法论 事前规划 …

网络运维Day03

文章目录 基本命令使用查看文本文件内容-cat命令分页查看文本文件-less命令查看CPU信息-lscpu命令查看系统内核版本-uname命令查看机修改主机名-hostname命令查看IP地址-ifconfig命令创建目录-mkdir命令创建空文件-touch命令查看文件前几行-head命令查看文件后几行-tail命令快速…

2024年CleanMyMac更新了哪些内容?

CleanMyMac作为一款专业的苹果电脑清理软件&#xff0c;它不仅仅能单纯的卸载不用、少用的应用&#xff0c;同时还支持&#xff1a;1、清理应用程序的数据文件&#xff0c;将应用重置回初始状态&#xff0c;减少空间占用&#xff1b;2、自动检查应用更新&#xff0c;保持应用的…

Hyper-V 安装windows10 虚拟机,且能调试窗口大小、与主机之间复制文件

1. 搜索栏--打开‘启动或关闭windows功能’-- 勾选 ‘ Hyper-V ’ 然后点击确定&#xff1b; 2. 搜索栏--打开‘ Hyper-V 快速创建’ ---本地安装源---更改安装源&#xff08;选择 对应的 windows.iso 镜像&#xff09;---创建镜像--启动虚拟机--&#xff08;到达&#xff09;P…

优化|随机零阶优化算法分析

原文&#xff1a;Random Gradient-Free Minimization of Convex Functions. Found Comput Math 17, 527–566 (2017). https://doi.org/10.1007/s10208-015-9296-2 原文作者&#xff1a;Yurii Nesterov, Vladimir Spokoiny 论文解读者&#xff1a;陈宇文 本次知识分享活动挑选…

【中国知名企业高管团队】系列58:创维SKYWORTH

昨天华研荟介绍了位于深圳的彩电三巨头之一——康佳KONKA&#xff0c;今天介绍创维SKYWORTH。两家公司都是以做电视起家的&#xff0c;但是发展历程和现在的业务差别非常大&#xff0c;当然&#xff0c;过程中发生的故事也是波澜起伏。 一、关于创维 创维集团有限公司&#x…