C++联合体

【c++教程】2.8-联合体类型 联合体 union,联合体类型,有的时候也会被叫做共用体。也是一种特殊的类类型,和结构体很相似。 1,联合体所有的成员都共用同一段内存。联合体中的所有成员,只有一个可以是活跃的,其他的都是不可用的。 2,联合体必须以分号结束。 3,联合体不可以用于继承,没有虚函数。数据成员默认的声明方式为公有。 4,在c++11以前,联合体不可以有含有自定义的构造函数,自定义的析构函数或者重载的复制赋值运算符的成员。在c++11以后,联合体可以有这些成员,但是相关的所有函数全都被丢弃,需要自行提供。 联合体的使 阅读详情

C++ 中的联合体是多个变量共享一段内存(相互覆盖),联合体的内存占用是所有成员中内存最大的那个所占用的大小。

1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除。

看下面这段示例代码

#include <iostream>

using namespace std;

union U1
{
	int n;
	char s[12];
	double d;
};

union U2
{
	int n;
	char s[5];
	double d;
};

int main()
{
	U1 u1;
	U2 u2;

	cout << "sizeof(u1) : " << sizeof(u1) << "sizeof(U1) : " << sizeof(U1) << endl;
	cout << "sizeof(u2) : " << sizeof(u2) << "sizeof(U2) : " << sizeof(U2) << endl;

	cout << "u1的地址:" << &u1 << "\nu1.n的地址:" << &u1.n << "\nu1.s的地址:" << &u1.s
		<< "\nu1.d的地址:" << &u1.d << endl;
	cout << "u2的地址:" << &u2 << "\nu2.n的地址:" << &u2.n << "\nu2.s的地址:" << &u2.s
		<< "\nu2.d的地址:" << &u2.d << endl;

	system("pause");
	return 0;
}

运行结果

sizeof(u1) : 16sizeof(U1) : 16
sizeof(u2) : 8sizeof(U2) : 8
u1的地址:002DF70C
u1.n的地址:002DF70C
u1.s的地址:002DF70C
u1.d的地址:002DF70C
u2的地址:002DF6FC
u2.n的地址:002DF6FC
u2.s的地址:002DF6FC
u2.d的地址:002DF6FC
请按任意键继续. . .

可以看到 U1的大小是16,U1中最大成员占用的内存是12个字节,但是12不能被double类型8个字节整除,所以这里U1要占用16个字节。可以看到联合体中的元素都是占用的同一块存储区域,起始地址都是同一个地址

我们再看一个示例

#include <iostream>

using namespace std;

union U
{
	int n;
	char c[4];
};

int main()
{
	U u;
	u.n = 0xa1a2a3a4;
	cout << "hex u.n = " << hex << u.n << " u.n address = " << &u.n << endl;
	cout << "u.c[0] = " << hex << (int)u.c[0] << " u.c[0] address = " << (void*)&u.c[0] << endl;
	cout << "u.c[1] = " << hex << (int)u.c[1] << " u.c[1] address = " << (void*)&u.c[1] << endl;
	cout << "u.c[2] = " << hex << (int)u.c[2] << " u.c[2] address = " << (void*)&u.c[2] << endl;
	cout << "u.c[3] = " << hex << (int)u.c[3] << " u.c[3] address = " << (void*)&u.c[3] << endl;

	system("pause");
	return 0;
}

输出

hex u.n = a1a2a3a4 u.n address = 00D3FCA4
u.c[0] = ffffffa4 u.c[0] address = 00D3FCA4
u.c[1] = ffffffa3 u.c[1] address = 00D3FCA5
u.c[2] = ffffffa2 u.c[2] address = 00D3FCA6
u.c[3] = ffffffa1 u.c[3] address = 00D3FCA7
请按任意键继续. . .

可以看到 c[0]里存储的是0xa4这个字符,c[1]里存储的是0xa3,c[2]里存储的是0xa2,c[3]里存储的是0xa1

采用的是小端模式存储

再看一个例子

#include <iostream>
using namespace std;

union 
{
	int i;
	char st[2];
}un;

int main()
{
	un.st[0] = 6;
	un.st[1] = 10;
	cout << un.i << endl;

	system("pause");
	return 0;
}

这里输出

2566

我们将 2566 换成 2进制是 :  ‭00001010   00000110

6 换成2进制是 :00000110

10换成2进制是:00001010

所以我们可以看出,这里是采用低位在前的存储方式也就是 st[1]st[0]‬

 

 

 

 

C++中的联合(Union):灵活存储多类型数据的利器 联合是一种特殊的数据结构,它允许在相同的内存空间中存储多种不同类型的成员。不同于结构体(Struct),联合的成员共享同一块内存空间。这意味着在给一个联合变量赋值时,只能使用其中的一个成员。int i;float f;char c;在上述示例中,MyUnion是一个联合类型,它包含了intfloat和char三个成员。这三个成员共享同一块内存空间,即改变其中一个成员的值会影响其他成员的值。 阅读详情

相关推荐

C/C++中的联合体

C/C++中的联合体 利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。

oohaha_123的专栏 1389

C++之联合体

一、联合体的定义 联合体是一个特殊的类,其关键词是union,联合体的数据任意时刻只有一个值是有状态的,当有新的数据赋值了,会将其他值覆盖掉。声明变量时,变量类型可以时public、private、protected,默认是public。 二、联合体的举例 union My_union { int a; int b; double c; }u; 三、联合体的特点 1、联合体申请的内存空间大小是联合体中占用内存最大的数据大小。例如上述的联合体,sizeof(My_union)的输出是

qq_43363657的博客 6646

C++ 结构体和联合体

结构体和联合体定义联合体结构体结构体数据对齐问题结构体内存布局结构何数据缺省对齐原则32位CPU修改默认编译选 定义 联合体 使用union定义的是联合体 利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用".“和”->"来直接访问。 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为

压缩疯雷的博客 511

C++联合体详解!

C++联合体知识点详解,关注主播不迷路喔!

PingdiGuo_guo的博客 3867

C++:34---union:联合/共用体,一种节省空间的类

一、联合(union)概述联合(union)是一种特殊的类一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当我们给union的某个成员赋值之后,该union的其...

yolo模型训练找我,AI游戏合作找我 1444

FX2N-2AD模块实战:从硬件连接到FROM/TO指令编程详解

本文详细解析FX2N-2AD模拟量输入模块的硬件连接与FROM/TO指令编程技巧,涵盖BFM缓冲存储器配置、梯形图程序设计及工程实战经验。通过实例演示如何实现精准信号采集与数据处理,特别针对PLC系统中的常见故障提供解决方案,助力工业自动化工程师高效完成设备调试与维护。

prometheus9mon的博客 507

C++ 联合体

联合体是一种特殊的数据类型,其特点是所有成员共享同一块内存空间,大小等于最大成员的大小。与结构体不同,联合体同一时间只能有效存储一个成员的值,修改一个成员会覆盖其他成员。

平平无奇的小甜菜 844

手把手教你用UC3842搭建12V/5A反激电源(附PSIM仿真文件)

本文详细介绍了基于UC3842的12V/5A反激电源设计与PSIM仿真实践。从UC3842芯片选型、高频变压器计算到PSIM仿真模型搭建,提供完整的开关电源设计流程。特别包含PCB布局要点和实测优化建议,帮助工程师快速掌握反激电源开发技巧。

u6v7w8x的博客 1202

浅谈C++联合体

1. 联合体 《C++ Primer Plus》第六版中关于联合体的描述是:共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。 联合体(union)(即共用体)的声明格式如下: union MyUnion { int iA; double dA; char cA; }; 关键字union表示MyUnion是一个联合体,MyUnion是一种用户自定义的数据类型,其使用方法如下: MyUnion Ua; Ua.iA=10; 根据《C++ Primer Plus

GeomasterYi的博客 2469

【短路计算篇】短路电流计算详解:从理论到实践

短路电流是指在正常电路中电势不同的两点之间发生阻抗极小的故障而引起的过电流。短路时电流强度很大,可能达到额定电流的10-15倍,大容量电力系统中短路电流可达数万安。简单比喻:短路就像水管突然爆裂,水流瞬间增大很多倍,对管道系统造成巨大冲击。短路电流计算是电气系统设计中的基础性工作,关系到整个系统的安全运行。通过本文介绍的各种计算方法,工程师可以根据具体情况选择合适的方法进行准确计算。

2301_81299416的博客 3962

Frida精准定位Shopee x-sap-ri动态签名生成函数

x-sap-ri是Shopee客户端生成的上下文感知型动态令牌,本质为基于设备标识、请求路径与毫秒级时间戳三元组的SHA256哈希值,经Base64编码后作为防重放与防批量伪造的核心校验字段。其生成逻辑深度混淆且跨Java/Native层,静态分析失效,而Frida凭借内存级函数调用拦截与JNI层穿透能力,成为唯一可行的技术路径。本文聚焦Frida在加固App中的实战适配——通过libcrypto.so API特征扫描反向定位被抹名的生成函数,实现对x-sap-ri输入参数(如16字节device_id加密

weixin_33978578的博客 610

C++联合体的定义

结构体是“我全都要”的独立空间联合体是“你选一个”的共享空间联合体(union)的核心是内存共享。所有成员共用同一块内存,因此联合体的大小等于其最大成员的大小。同一时间只能有一个成员是有效的,给一个成员赋值会覆盖掉其他成员的数据。联合体的内存大小一般等于它最大成员的大小,以便所有成员都能使用这块共享的内存。如果联合体中有两个或多个大小相同的最大类型,它们共同决定了联合体的大小。联合体的大小规则是以大小为基准,而不是以某个具体的类型为基准。简洁,在联合体声明后直接创建变量,适合一次性使用。

别人的话只能作为参考,不能作为自己的人生标准。 578

微信小程序转化数据API自归因实战:PHP实现与2025升级要点解析

本文详细解析了2025年微信小程序转化数据API自归因的升级要点与PHP实战实现。核心变化包括接口地址更新、固定access_token的获取方式,以及新增timestamp与nonce等安全参数。文章提供了完整的PHP代码示例,帮助开发者高效完成数据上报,优化腾讯广告投放效果。

git9versioner的博客 989

C++联合体浅见

最近在学习C++进阶的内容,发现了C++一种特殊的类叫联合体。我是在github上的一个项目上学习的,个人觉得这个项目挺不错的链接 特点 1.与结构体不同,联合体所有变量公用一块内存空间,联合体的内存长度是由变量中内存长度最长的变量所决定的。 union MyUnion { struct MyStruct { int x; int y; int j; }u; int k; }; MyUnion a; a.u.x = 1; a.u.y = 2; a.u.j = 3; a.k = 4

宇哥的博客 388

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 281

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1585

10 C++11 非受限联合体

C++11 非受限联合体介绍

Snow__Sunny的博客 551

PyQt5开发编译器安装(PyCharm安装)

PyCharm 提供了最完整的 PyQt5 开发体验,特别是其集成的调试工具和 Qt Designer 支持,能显著提高开发效率。是最受欢迎和功能最完整的 IDE。它专门为 Python 开发优化,对 PyQt5 有很好的支持。右键运行该文件,如果出现窗口说明配置成功。对于 PyQt5 开发,

啊渊的专栏 417

C++ 联合体终极指南

联合体(union)是一种特殊的数据结构,所有成员共享同一块内存空间。其核心特点包括:同一时间只能使用一个成员,大小由最大成员决定,修改一个成员会影响其他成员的值。联合体的基本语法简单,适用于类型转换、协议解析和节省内存等场景。C++11后支持匿名联合体和非平凡类型成员,但需手动管理构造和析构。联合体不能继承、包含虚函数或静态成员,且C++11前不能包含带构造函数的成员。相比于结构体,联合体共享内存,同一时间只能使用一个成员,常用于底层操作。实际应用中,联合体可用于模拟CPU寄存器、处理图形颜色等。使用时需

qq_44815135的博客 539

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C/C++编程:联合体

联合体声明 联合体是特殊的类类型,它在一个时刻只能保有一个非静态数据成员 union attr 类头名 { 成员说明 } 联合体union的定义方式与结构体一样,但是二者有根本区别。 在结构体中各成员有自己的内存空间,一个结构变量的总长度是各个成员长度之和 在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最大的长度 共用体使不同的类型变量存放到同一段内存单元中,所以共用体在同一时刻只能存储一个数据成员的值,共用体的大小等于最大成员的大小(结构体变量的大小是所有数据成员大小的总和)

OceanStar的博客 3531

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++ 构造函数析构函数 数据安全_当cpp联合体遇到类的构造函数

在学习Qt的QVariant时,Qt Create的说明手册中说道:Because C++ forbids unions from including types that have non-default constructors or destructors, most interesting Qt classes cannot be used in unions. 大概意思是:因为c++禁止...

weixin_30558657的博客 188

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C/C++中的联合体union介绍

目录 union定义与简单使用 内存分配与所占空间 多种访问内存途径共存 数据存储位置 union应用之寄存器读取 union,中文名“联合体、共用体”,在某种程度上是类似结构体struct的一种数据结构,联合体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

会意的博客 4万+

【C/C++】联合体

简单地解释一下以上代码,当结构体gift被使用的时候,联合体中的book和shirt共用一块空间,由于两个结构体(book和shirt)个别性质是独立的,不会同时使用,所以在使用一方的时候,不用在意另外一方的数据被改变,从而减少空间的浪费。如上述代码所示,当使用结构体来声明礼物的时候,在此结构体中使用联合体,可以减少结构体gift占用的空间,从而优化程序。

bitenum的博客 542

一天学一点C++之联合体

一个比特代表了0和1两种(不通电和通电)状态中的一个, 即一个比特可以表示两种状态,计算机一般将8个比特组织为一个字节,古一个字节可以表示2的8次方种状态,而给每个字节编一个地址,大家可以通过地址访问到该字节。:由于所有成员共享同一块内存,每个成员都是从0开始,先求出最大空间的成员所占的字节数再判断其是否满足最大成员的对齐要求(最大空间与最大:int[10], 与double),如果满足则不变,否则扩充至符合要求出。如果成员的偏移量不是其自然对齐要求的整数倍,编译器会在成员前插入填充字节。

2301_79024503的博客 917

(六)C++中的结构体与联合体

在专栏C++教程的第五篇C++指针与引用中,深入了解C++中指针和引用是两种重要的数据类型,它们提供了对内存地址的间接访问能力,增强了程序设计的灵活性和效率。在专栏C++教程的第六篇中,我们将探讨C++中的结构体(struct)与联合体(union)的概念和使用场景。

tyz_C的博客 2686

24.C++11之非受限联合体

非受限联合体的定义和传统联合体基本相同,只是放宽了对成员类型的限制,允许包含具有非平凡特殊成员函数的类型。// 非受限联合体定义int i;

qq_56402998的博客 907
上一篇: c++ string 自己构造string
下一篇: c++继承构造函数
qiukapi
博客等级 码龄12年 51粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值