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

union类型

  union称为共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。
例如,把一个整型变量、一个字符型变量,一个双精度型变量放在同一个地址开始的内存单元中:
u

一、联合体的定义

定义一个联合体类型的一般形式为:
union 联合体名
{
成员表
};
成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名
成员名的命名应符合标识符的规定。
例如:

union perdata
{
int Class;
char Office;
};

  定义了一个名为perdata的联合体类型,它含有两个成员,一个为整型,成员名为Class;另一个为字符,字符名为Office。联合体定义之后,即可进行联合体变量声明,被声明为perdata类型的变量,可以存放整型量Class或存放字符型的变量Office。

二、联合变量的声明

  联合体变量的声明和结构变量的声明方式相同,也有三种形式。即先定义,再声明;定义同时声明和直接声明。

以perdata类型为例,声明如下:
union perdata
{
int Class;
char Office;
};
union perdata a,b;
或者可同时说明为:
union perdata
{
int Class;
char Office;
}a,b;
或直接说明为:
union
{
int Class;
char Office;
}a,b;

  经说明后的a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员类型中最长的长度,即等于Class的长度,共4个字节。a,b变量如赋予整型值时,只使用了4个字节,而赋予字符时,可用1个字节。

三、union应用实例

1、试验实例

#include <iostream>
using namespace std;union test
{char mark;long num;float score;
}a;int main()
{// cout<<a<<endl; // wronga.mark = 'b';cout<<a.mark<<endl; // 输出'b'cout<<a.num<<endl; // 98 字符'b'的ACSII值cout<<a.score<<endl; // 输出错误值a.num = 10;cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正cout<<a.num<<endl; // 输出10cout<<a.score<<endl; // 输出错误值a.score = 10.0;cout<<a.mark<<endl; // 输出空cout<<a.num<<endl; // 输出错误值cout<<a.score<<endl; // 输出10return 0;
}

2、测试CPU是大端模式还是小端模式

#include <iostream>
using namespace std;void checkCPU()
{union MyUnion{int a;char c;}test;test.a = 1;if (test.c == 1)cout << "little endian" <<endl;else cout << "big endian" <<endl;
}int main()
{checkCPU();return 0;
}

四、union与struct比较

  在结构中各成员有各自的内存空间,一个结构体变量的总长度大于等于各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。如上面介绍的“单位”变量,定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符型(教研室)。要么赋予整型值,要么赋予字符型,不能把两者同时赋予它。联合类型的定义和联合变量的说明:一个联合类型必须经过定义之后,才能把变量说明为该联合类型。

比较图示:

u3
u1

比较测试:

struct student
{char mark;long num;float score;
};

其struct的内存结构如下,sizeof(struct student)的值为12bytes。

union test
{char mark;long num;float score;
};

sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。

http://www.wxhsa.cn/company.asp?id=442

相关文章:

  • PDE,广义特征问题,和神经特征函数法
  • 查看mysql具体使用那个glibc的版本的mysql
  • 【A】月半猫想吃麦当劳(待完坑)
  • 【A】宝宝肚肚打雷了(待完坑)
  • 01_TCP协议概念
  • 【A】杂题宣讲
  • 登录认证-上篇:基于 Session 的传统身份验证
  • 【A】chipi chipi chapa chapa
  • vLLM框架本地布署Qwen3-32B模型 - yi
  • 项目管理软件中有哪些不同的模块以及如何导出其报告?
  • 第十三届 TCCT 随机系统与控制专题研讨会 暨2025年智能控制与计算科学国际学术会议 (ICICCS 2025)
  • Kubernetes命名空间(Namespace)
  • linux安装python
  • 【IEEE、电力学科品牌会议】第五届智能电力与系统国际学术会议(ICIPS 2025)
  • 软工第一次作业
  • 注释
  • Microsoft 推出 .NET 10 RC 1
  • 2025 第九届控制工程与先进算法国际论坛(IWCEAA 2025)
  • kotlin中的netty
  • 多态
  • 数学分析 I
  • 高等代数 I
  • JAVA反编译神器CFR
  • 记录一下由于VS中qt的插件自动升级引发的编译问题
  • flutter右滑返回直接返回到native问题
  • ck随笔
  • 如何用变量与函数实现随机生成数字交互?附完整教程
  • 离散数学与结构 note
  • Java基础
  • Linux系统简单源码安装NGINX版本1.28.0