自定义类型联合体
目录
- 联合体
- 联合体类型的声明
- 联合体的特点
- 相同成员的结构体和联合体对比
- 联合体大小的计算
- 联合体的应用
- 联合的一个练习
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 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.…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果:def __in…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
