当前位置: 首页 > 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.rkmt.cn/news/1859.html

相关文章:

  • 学习笔记
  • 01_TCP协议概念
  • 【A】chipi chipi chapa chapa
  • linux安装python
  • 【IEEE、电力学科品牌会议】第五届智能电力与系统国际学术会议(ICIPS 2025)
  • CE第9关X64版本问题记录
  • 多态
  • 数学分析 I note
  • 记录一下由于VS中qt的插件自动升级引发的编译问题
  • ck随笔
  • 终结“网络无助感”:Tenable CEO解析漏洞管理与安全心态
  • 生产搭建Hadoop
  • 生产搭建Rabbitmq
  • macOS Tahoe 26 RC (25A353) Boot ISO 原版可引导镜像下载
  • 企业如何选型低代码平台?4款产品测评
  • torch版本应该跟cuda、cudacnn的版本一致
  • 安装mysql数据库,从下载到配置的详细教程
  • [BJOI2018] 染色 题解
  • 金蝶云星空学习记录1
  • (简记)虚树
  • AI测试平台自动遍历:低代码也能玩转全链路测试
  • Cesium Shader内置变量 czm_*
  • IDA Pro 9.2 发布 - 强大的反汇编程序、反编译器和多功能调试器
  • Java 那些基础又关键的事儿
  • Codeforces Round 1047 (Div. 3)
  • 设计模式-策略
  • 数据库基本查询语句
  • 《Python数据结构与算法分析》代码
  • jmeter测试mysql
  • Docker容器