当前位置: 首页 > news >正文

C++联合体的定义

联合体和结构体的区别

结构体的每个成员都有单独的内存,相互之间是没有影响的。
联合体的每个成员都是共享的内存,修改其中一个,也会影响其他成员。对于联合体来说,所有成员都从相同的内存地址开始

结构体(struct)

结构体是一个大箱子,里面分成了好几个独立的格子每个格子里都能放不同的东西,互不影响

  • 特点:所有格子都同时存在,所以这个箱子的大小是所有格子大小的总和
  • 比喻:就像一个多层便当盒,每层都能放不同的菜,所有菜同时都在盒子里。

联合体(union)

联合体是一个神奇的箱子,里面只有一个共用的大格子。这个格子可以放任何东西,但同一时间只能放一种

  • 特点:所有东西都共享同一空间,所以这个箱子的大小只有它里面最大的那个东西来决定。
  • 比喻:就像一个万能工具箱,你可以放螺丝刀,也可以放扳手,但不能同时放。你放了螺丝刀后,扳手就不在了。

总结

  • 结构体是“我全都要”的独立空间
  • 联合体是“你选一个”的共享空间

 


 

联合体的简介

联合体(union)的核心是内存共享。所有成员共用同一块内存,因此联合体的大小等于其最大成员的大小。同一时间只能有一个成员是有效的,给一个成员赋值会覆盖掉其他成员的数据。

联合体的内存大小一般等于它最大成员的大小,以便所有成员都能使用这块共享的内存。如果联合体中有两个或多个大小相同的最大类型,它们共同决定了联合体的大小。

联合体的大小规则是以大小为基准,而不是以某个具体的类型为基准。

 


 

联合体的四种典型格式

标准方式

特点

先声明联合体类型,再定义变量,适用于全局或多次使用。

格式

  • 带有标签(tag)或名称的联合体定义格式
    union 联合体名称{数据类型 变量名;数据类型 变量名;// ...}
    
  • 联合体声明格式
    联合体名称 变量名;
    
  • 赋值联合体成员
声明的变量名.联合体中的变量名 = 变量值;

示例

#include <iostream>
using namespace std;union Book{int a;double b;char c;
};int main(){Book d;d.a = 2;cout << d.a << endl;    d.b = 3.14;cout << d.b << endl;d.c = 'A';cout << d.c << endl;return 0;
}

声明时直接定义变量

特点

简洁,在联合体声明后直接创建变量,适合一次性使用。

格式

  • 声明联合体类型时直接定义变量的格式:

    union 联合体名称{变量类型 变量名;变量类型 变量名;// ...
    }变量名,变量名,......;
    
  • 赋值结构体成员:

    声明的变量名.联合体中的变量名 = 变量值;
    

示例

#include <iostream>
using namespace std;union Book{int a;double b;char c;
}d,e;int main(){d.a = 2;cout << d.a << endl;d.b = 3.1;cout << d.b << endl;d.c = 'A';cout << d.c << endl;e.a = 3;cout << e.a << endl;e.b = 3.2;cout << e.b << endl;e.c = 'B';cout << e.c << endl;return 0;
}

匿名联合体

特点

无类型名,仅能通过变量访问,适用于局部简单场景

格式

  • 匿名联合体定义并直接声明变量

    union {变量类型 变量名;变量类型 变量名;// ...
    }变量名,变量名,......;
    
  • 赋值结构体成员

    声明的变量名.联合体中的变量名 = 变量值;
    

示例

#include <iostream>
using namespace std;union {int a;double b;char c;
}d,e;int main(){d.a = 2;cout << d.a << endl;d.b = 3.1;cout << d.b << endl;d.c = 'A';cout << d.c << endl;e.a = 3;cout << e.a << endl;e.b = 3.2;cout << e.b << endl;e.c = 'B';cout << e.c << endl;return 0;
}

使用typedef别名简化

特点

通过typedef为联合体创建别名,增强代码可读性(C风格)。

格式

  • 普通联合体别名简化

    typedef union 结构体名称{// 成员
    }新的类别名;
    
  • 匿名联合体别名简化

    typedef union{// 成员
    }新的类型别名;
    
  • 联合体声明格式:

    联合体名称 变量名;
    
  • 赋值联合体成员:

    声明的变量名.联合体中的变量名 = 变量值;
    

示例

#include <iostream>
using namespace std;typedef union {int a;double b;char c;
}shuju;int main(){shuju d,e;d.a = 2;cout << d.a << endl;d.b = 3.1;cout << d.b << endl;d.c = 'A';cout << d.c << endl;e.a = 3;cout << e.a << endl;e.b = 3.2;cout << e.b << endl;e.c = 'B';cout << e.c << endl;return 0;
}
http://www.lryc.cn/news/619230.html

相关文章:

  • 六、SpringBoot多环境开发
  • 数据结构 二叉树(2)堆
  • 论区间dp:常用模型(附极角排序教程)
  • 计算机网络摘星题库800题笔记 第5章 传输层
  • 正则表达式解析(二)
  • mysql中的常见的索引类型及其特点
  • 前端css学习笔记3:伪类选择器与伪元素选择器
  • 开源!!! htop移植到OpenHarmony
  • 基于LLVM的memcpy静态分析工具:设计思路与原理解析(C/C++代码实现)
  • 实现文字在块元素中水平/垂直居中详解
  • tensorrt-llm0.20.0离线部署DeepSeek-R1-Distill-Qwen-32B
  • Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
  • 2787. 将一个数字表示成幂的和的方案数
  • 万物平台模型导入样例大全(实时更新中~)
  • 力扣面试150题--爬楼梯 打家劫舍 零钱兑换 最长递增子序列
  • 10. React组件间的通信
  • 某跨国金融机构法律法规自动文本摘要(ATS/文本大意提取)功能规划
  • Ansible 基础到实操笔记
  • scikit-learn/sklearn学习|岭回归python代码解读
  • 鸿蒙开发资源导航与学习建议
  • 计算机网络2-2:物理层下面的传输媒体
  • 第23章,景深:技术综述
  • 【Python办公】Mermaid代码转图片工具 - Tkinter GUI版本
  • Apache虚拟主机三种配置实战
  • 运维学习Day22——Anisible自动化与基本使用
  • JavaEE 初阶第十八期:叩开网络世界的大门
  • 随身WIFI每个月需要交钱吗?流量卡还是随身WIFI哪个更好用?正规随身WIFI品牌有哪些?谁才是真性价比之王?
  • 当“超级高速“遇见“智能大脑“:5G-A×AI如何重塑万物智联时代
  • Linux文件系统:从虚拟接口到物理实现的架构解析
  • 存储过程作为系统逻辑核心的架构思考 —— 以 SaaS 系统为例