C++联合体的定义

联合体和结构体的区别

结构体的每个成员都有单独的内存 ,相互之间是没有影响的。

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

结构体(struct)

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

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

联合体(union)

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

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

总结

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

联合体的简介

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

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

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


联合体的四种典型格式

标准方式

特点

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

格式

  • 带有标签(tag)或名称的联合体定义格式

    cpp 复制代码
    union 联合体名称{
    	数据类型 变量名;
    	数据类型 变量名;
    	// ...
    	}
  • 联合体声明格式

    cpp 复制代码
    联合体名称 变量名;
  • 赋值联合体成员

cpp 复制代码
声明的变量名.联合体中的变量名 = 变量值;

示例

cpp 复制代码
#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;
}

声明时直接定义变量

特点

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

格式

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

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

    cpp 复制代码
    声明的变量名.联合体中的变量名 = 变量值;

示例

cpp 复制代码
#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;
}

匿名联合体

特点

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

格式

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

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

    cpp 复制代码
    声明的变量名.联合体中的变量名 = 变量值;

示例

cpp 复制代码
#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风格)。

格式

  • 普通联合体别名简化

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

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

    cpp 复制代码
    联合体名称 变量名;
  • 赋值联合体成员:

    cpp 复制代码
    声明的变量名.联合体中的变量名 = 变量值;

示例

cpp 复制代码
#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;
}
相关推荐
生成论实验室3 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法
li16709027015 分钟前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
We་ct32 分钟前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
风筝在晴天搁浅32 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发34 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星40 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅42 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
weixin_427771611 小时前
前端调试隐藏元素
前端
zh_xuan1 小时前
libcurl调用https接口
c++·libcurl