自定义类型联合体
目录
- 联合体
- 联合体类型的声明
- 联合体的特点
- 相同成员的结构体和联合体对比
- 联合体大小的计算
- 联合体的应用
- 联合的一个练习
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 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];//大小5int 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");elseprintf("大端\n");
}

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

相关文章:
自定义类型联合体
目录 联合体联合体类型的声明联合体的特点相同成员的结构体和联合体对比联合体大小的计算联合体的应用联合的一个练习 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸…...
【Shell 系列教程】Shell printf 命令( 六)
文章目录 往期回顾Shell printf 命令printf 的转义序列 往期回顾 【Shell 系列教程】shell介绍(一)【Shell 系列教程】shell变量(二)【Shell 系列教程】shell数组(三)【Shell 系列教程】shell基本运算符&a…...
2022年电工杯数学建模B题5G网络环境下应急物资配送问题求解全过程论文及程序
2022年电工杯数学建模 B题 5G网络环境下应急物资配送问题 原题再现: 一些重特大突发事件往往会造成道路阻断、损坏、封闭等意想不到的情况,对人们的日常生活会造成一定的影响。为了保证人们的正常生活,将应急物资及时准确地配送到位尤为重要…...
git reflog 恢复git reset --hard 回退的内容
首先使用 git reflog 查看处理的历史,历史是由新到旧排列的,找到回退前的commit的id,找的过程可以只关注HEAD的部分,HEAD括号中的值越大越旧,越小越新。 找到后执行以下命令 git reset --hard 你的commit_id 然后…...
kali Linux中更换为阿里镜像源
准备: kali Linux 阿里源链接 deb kali安装包下载_开源镜像站-阿里云 kali-rolling main non-free contrib deb-src kali安装包下载_开源镜像站-阿里云 kali-rolling main non-free contrib 配置: 打开kali 终端输入:sudo nano /etc/apt…...
【每日一题】移除链表元素(C语言)
移除链表元素,链接奉上 目录 思路:代码实现:链表题目小技巧: 思路: 在正常情况: 下我们移除链表元素时,需要该位置的前结点与后节点, 在特别情况时: 例如 我们发现&…...
stm32 ADC
目录 简介 stm32的adc 框图 ①电压输入范围 ②输入通道 编辑③ADC通道 ④ADC触发 ⑤ADC中断 ⑥ADC数据 ⑦ADC时钟 ADC的四种转换模式 hal库代码 标准库代码 简介 自然界的信号几乎都是模拟信号,比如光亮、温度、压力、声音,而为了方便存储、…...
linux网络服务综合项目
前期环境配置 #主要写了192.168.146.130的代码,131的配置代码和其一样 [rootserver ~]# nmtui #通过图形化界面修改ens160的ip 192.168.146.130 [rootserver ~]# hostnamectl set-hostname Server-Web #修改130主机名…...
每日一题(LeetCode)----数组--移除元素(三)
每日一题(LeetCode)----数组–移除元素(三) 1.题目([283. 移动零](https://leetcode.cn/problems/sqrtx/)) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请…...
AI:57-基于机器学习的番茄叶部病害图像识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...
人工智能-深度学习计算:层和块
我们关注的是具有单一输出的线性模型。 在这里,整个模型只有一个输出。 注意,单个神经网络 (1)接受一些输入; (2)生成相应的标量输出; (3)具有一组相关 参数…...
Linux第一个小程序进度条
缓冲区 在写进度条程序之前我们需要介绍一下缓冲区,缓冲区有两种,输入和输出缓冲区,这里主要介绍输出缓冲区。在我们用C语言写代码时,输出一些信息,实际上是先输出到输出缓冲区里,然后才输出到我们的显…...
JavaEE平台技术——预备知识(Maven、Docker)
JavaEE平台技术——预备知识(Maven、Docker) 1. Maven2. Docker 在观看这个之前,大家请查阅前序内容。 😀JavaEE的渊源 😀😀JavaEE平台技术——预备知识(Web、Sevlet、Tomcat) 1. M…...
【ChatOCR】OCR+LLM定制化关键信息抽取(附开源大语言模型汇总整理)
目录 背景技术方案存在的问题及解决思路关键信息提取结果其他解决方案替换文心一言LangChain大型多模态模型(Large Multimodal Model, LMM) 开源大模型汇总LLaMA —— Meta 大语言模型Stanford Alpaca —— 指令调优的 LLaMA 模型Lit-LLaMA —— 基于 na…...
【位运算】XOR Construction—CF1895D
XOR Construction—CF1895D 参考文章 翻译 题目要求构造一个长度为 n n n 的数组 b b b,满足以下条件: 数组 b b b 中包含从 0 0 0 到 n − 1 n-1 n−1 的每个整数,且每个整数仅出现一次;对于 i i i 从 1 1 1 到 n − …...
解决Visual Studio Code 控制台中文乱码问题
C和CPP运行编码指定 "code-runner.executorMap": {"c": "cd $dir && gcc -fexec-charsetGBK $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt","cpp": "cd $dir && g -fexec-charsetGBK $…...
React Native自学笔记
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
程序员笔记本电脑选 windows 还是 MAC
计算机选择是每个进入 IT 行业同学的第一个重要选择,那么你是怎么选择的呢? 选择操作系统(Windows还是macOS)取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点,下面将分别讨论它们,以帮助…...
蓝桥杯每日一题2023.11.5
题目描述 方格分割 - 蓝桥云课 (lanqiao.cn) 题目分析 对于每个图我们可以从中间开始搜索,如果到达边界点就说明找到了一种对称的方法,我们可以直接对此进行答案记录每次进行回溯就会找到不同的图像,如果是一样的图像则算一种情况ÿ…...
多媒体应用设计师 2023年(含答案回忆版)
以下是小红书上的回忆版 软考考完疯狂回忆,多媒体应用设计师选择题 1.pattern 2.effective 3.merge 4.applications 5.graphic 6.udp 7.rtp 8.rtsp 9.10cm 10.永久 11…97 12.工作技术管理标准 13.管理型元数据 14.premiere 15.wave 16.500km/h 17.3M 18.44000 19.…...
一键隐藏桌面图标任务栏的实用工具
软件介绍 AutoDesktop是一个专门管理桌面图标显示与隐藏的小工具。它的作用很简单:一键把桌面上乱七八糟的图标和底部的任务栏全都藏起来,还你一个干干净净的桌面。 体积小巧运行轻量 整个软件才40K大小,真的非常小。双击运行后会自动关闭…...
【Hot 100 刷题计划】 LeetCode 55. 跳跃游戏 | C++ 贪心算法题解
LeetCode 55. 跳跃游戏 | C 贪心算法最优解题解 📌 题目描述 题目级别:中等 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如…...
RetroArch终极指南:如何为你的游戏手柄打造完美按键映射
RetroArch终极指南:如何为你的游戏手柄打造完美按键映射 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 想要在RetroArch中享受流…...
Pixel Language Portal 开发环境搭建:Windows 系统 Visual Studio 完整配置
Pixel Language Portal 开发环境搭建:Windows 系统 Visual Studio 完整配置 1. 准备工作与环境要求 在开始搭建Pixel Language Portal开发环境之前,我们需要确保系统满足基本要求并准备好必要的工具。Windows 10或11系统都能很好地支持这套开发环境&am…...
7Semi_SCD4x轻量驱动:嵌入式CO₂传感器I²C通信与CRC校验实践
1. 7Semi_SCD4x 驱动库深度解析:面向嵌入式系统的轻量级 SCD40/SCD41 CO₂ 传感器驱动设计与工程实践1.1 项目定位与工程价值7Semi_SCD4x 是一个专为 Sensirion SCD40/SCD41 系列高精度 CO₂、温度与湿度三合一传感器设计的极简底层驱动库。其核心价值不在于功能堆砌…...
绝地求生压枪难题如何破解?5个核心技巧让罗技鼠标宏成为你的制胜法宝
绝地求生压枪难题如何破解?5个核心技巧让罗技鼠标宏成为你的制胜法宝 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生…...
游戏开发实战:Unity中合并带材质的.obj模型文件全攻略
Unity游戏开发实战:高效合并带材质的.obj模型文件全流程解析 在游戏开发中,资源优化始终是提升性能的关键环节。当项目涉及大量.obj格式的3D模型时,合并这些文件不仅能减少Draw Call,还能显著简化资源管理流程。本文将深入探讨如何…...
Tsuru平台API文档工具终极比较:Swagger与ReDoc的完整指南
Tsuru平台API文档工具终极比较:Swagger与ReDoc的完整指南 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru 在当今云原生应用开发领域,Tsuru平台作为一款开…...
AI建站工具分人群解决方案:中小企业主、运营、外贸人分别怎么选
同样是想要一个网站,中小企业主、市场运营、外贸负责人、个人创作者的内心诉求,其实天差地别。老板看重的是成本和品牌形象;运营人员关心的是好不好改、能不能帮我获取线索;外贸人则把多语言和海外访问速度放在第一位。今天这篇文…...
AITemplate终极指南:动态形状与静态形状性能对比及选择策略
AITemplate终极指南:动态形状与静态形状性能对比及选择策略 【免费下载链接】AITemplate AITemplate is a Python framework which renders neural network into high performance CUDA/HIP C code. Specialized for FP16 TensorCore (NVIDIA GPU) and MatrixCore (…...
