C++ union联合体的用法(非常详细)
共用体又称为联合体,也是一种构造数据类型。它和结构体有些类似,都是将不同的数据项组织成为一个整体,区别是共用体在内存中占用首地址相同的一段存储单元。
共用体中,多个成员使用的是同一段内存空间,因此其变量所占的内存大小等于其最长成员的大小。一个共用体变量不能同时存放多个成员的值,某一时刻只能存放最后赋给它的值。
2) 定义共用体的同时声明共用体变量。例如:
3) 省略共用体类型名,直接声明共用体变量。例如:
4) 共用体成员的引用同样需使用成员运算符“.”。例如,可以使用 u.i、u.ch 和 u.f 引用共用体变量 u 的 3 个成员。
共用体的定义
定义共用体类型的一般形式如下:union 共用体类型名 { 成员类型 共用体成员名 1; 成员类型 共用体成员名 2; … 成员类型 共用体成员名 n; };其中,union 是定义共用体数据类型的关键字;共用体类型名是一个标识符,后续可用它定义共用体变量;大括号内是共用体成员,成员类型是常规的数据类型,用来设置共用体成员存储空间。
共用体中,多个成员使用的是同一段内存空间,因此其变量所占的内存大小等于其最长成员的大小。一个共用体变量不能同时存放多个成员的值,某一时刻只能存放最后赋给它的值。
共用体变量的声明和引用
1) 先定义共用体,然后声明共用体变量。例如:union myUnion //定义共用体 myUnion { int i; char ch; float f; }; myUnion u; //声明共用体变量u
2) 定义共用体的同时声明共用体变量。例如:
union myUnion //定义共用体 myUnion { int i; char ch; float f; }; u; //同时声明共用体变量u
3) 省略共用体类型名,直接声明共用体变量。例如:
union //省略共用体类型名 { int i; char ch; float f; } u; //直接声明共用体变量u
4) 共用体成员的引用同样需使用成员运算符“.”。例如,可以使用 u.i、u.ch 和 u.f 引用共用体变量 u 的 3 个成员。
初学者可能会有疑惑,共用体变量名可以赋值吗?其实只要赋的值是一个相同类型的共用体类型即可。引用共用体变量名也可以得到一个值,这个值就是共用体对象本身的值。注意,不能引用共用体变量,只能引用共用体变量中的成员。例如,直接引用 u 是错误的。
C++共用体实例
【实例】公司员工下班可以乘坐公交车或地铁,设计一个交通工具的共用体,让员工进行选择。在本实例中定义共用体变量,通过定义的函数引用共用体中的数据成员。#include <stdio.h> #include <string.h> struct bus //声明公交结构体类型 bus { char name[64]; }; struct subway //声明地铁结构体类型 subway { char name[64]; }; union Transportation //声明交通工具共用体类型 Transportation { struct bus p; struct subway c; }; int main() { union Transportation t; //定义交通工具共用体t strcpy(t.p.name, "地铁"); //将相应的名字复制给相应的变量 strcpy(t.c.name, "公交车"); printf("员工选择%s\n", t.p.name); //输出信息 printf("员工选择%s\n", t.c.name); return 0; }程序运行结果为:
员工选择公交车
员工选择公交车
共用体的特点
共用体数据类型有以下几个特点:- 使用共用体变量的目的是用同一个内存段存放几种不同类型的数据。注意,在同一时间只能存放其中的一种,而不能同时存放几种;
- 能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后,原有的成员将随之改变;
- 共用体变量的地址和它的各成员的地址是一致的;
- 不能对共用体变量名赋值,不能企图引用变量名来得到一个值,不能在定义共用体变量时对它初始化,不能用共用体变量名作为函数参数。