您的位置:首页 > 编程语言 > C语言/C++

c语言的union和struct

2017-05-17 21:14 375 查看

什么是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的成员。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 联合体 union