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语言复习(二)】struct 与 union 的分析
- C_C语言的enum、struct、union的使用详解
- c语言中的结构(struct)和联合(union)简介
- c语言中的结构(struct)和联合(union)
- C语言之struct和union分析
- C语言,struct,union
- 面试珠玑 C语言中union与struct的区别及sizeof的计算方式
- C语言中的struct、union、enum、Typedef
- C语言union中包含struct 小结
- c语言 结构(struct)和联合(union)简介
- c语言中的结构(struct)和联合(union)简介
- C语言中struct与union的区别
- 对《C语言:内存字节对齐详解——struct 和 union 》的理解
- C语言中的sizeof(struct )和sizeof(union)
- [转载] c语言中的结构(struct)和联合(union)简介
- C语言的struct/union字节对齐详解
- C语言多继承时子类与基类指针关系,union与struct区别,volatile修饰符作用
- C语言sizeof(struct)与sizeof(union)
- JAVA 与C语言中struct union 字节流转换方案 Javolution
- C语言中结构体(struct)和联合(union)的使用