什么是union(联合体)?
union(联合体):union是一个能在同一个存储空间(但不同时)存储不同类型数据的数据类型。
例如:
union test1
{
char a;
int b;
short c;
};
结构体(struct):是由一系列具有相同类型或不同类型的数据构成的数据集合
例如:
struct test2
{
char aa;
int bb;
short cc;
};
那么计算下面得输出
#include<iostream>
using namespace std;
union test1
{
char a;
int b;
short c;
};
struct test2
{
char aa;
int bb;
short cc;
};
int main()
{
cout << "sizeof union test1 is " << sizeof(test1) << endl;
cout << "sizeof struct test2 is " << sizeof(test2) << endl;
system("pause");
return 0;
}
输出是
sizeof union test1 is 4
sizeof struct test2 is 12
请按任意键继续. . .
为什么?
struct好理解,内存为各个成员变量所占内存的和(要注意数据对齐)
union呢?先看定义
union(联合体):union是一个能在同一个存储空间(但不同时)存储不同类型数据的数据类型。
不同时就是说在一个时刻union只能有一种数据类型,例如test1 同一时刻,只能是char ,int 或者
short可以理解为:一个厕所一个时刻只能有一个人用(胖子或者瘦子或者其他)
但又要能都装的下,所以union的内存长度(厕所大小)就是成员变量中内存长度最长(最胖的那个人)的长度(也要考虑对齐)
理解了union之后要怎么使用他呢?
在使用union的时候,我们还需要注意以下的几点:
1.同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。
2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:
#include <iostream>
using namespace std;
union test
{
char mark;
long num;
float score;
}a;
int main()
{
// cout<<a<<endl; // wrong
a.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; // 输出空
cout<<a.num<<endl; // 输出10
cout<<a.score<<endl; // 输出错误值
a.score = 10.0;
cout<<a.mark<<endl; // 输出空
cout<<a.num<<endl; // 输出错误值
cout<<a.score<<endl; // 输出10
return 0;
}
所以,在使用union的时候,要十二分的小心的。
3.由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。
4.不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。
5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。