union c语言什么意思,C语言、C++中的union用法总结(包懂)
开始的话
已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了)、重构(后期我也会说的了)了,却忽略了那些最基础,最根本的知识点。今天别人问我,我蒙了,所以,就有了这篇文章。
什么是union?
翻译过来说,就是共用体,或者也叫联合体。说到了union,也就是共用体,就不得不说一下struct了,当我们有如下的struct的定义时:
复制代码 代码如下:
struct student
{
char mark;
long num;
float score;
};
关于struct的内存结构,将就会像下图所示这样(在x86机器上演示):
sizeof(struct student)的值为12bytes。但是,当我们定义如下的union时,
复制代码 代码如下:
union test
{
char mark;
long num;
float score;
};
sizeof(union test)的值为4。这为什么呢?这就是需要说的。 有的时候,我们需要几种不同类型的变量存在在同一段的内存空间中,就像上面的,我们需要将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中。上面的三个变量,char类型和long类型所占的内存字节数是不一样的,但是在union中,它们都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。上面定义的union类型的结构如下:
上面也说了,sizeof(union test)的值为4。那为什么是4呢?大体上来说,结构体struct所占用的内存为各个成员的占用的内存之和(当然也需要考虑内存对齐的问题了)。而对于union来说,在谭浩强的《C语言程序设计》中这么说:union变量所占用的内存长度等于最长的成员的内存长度。很显然,这是不对的,对于union所占用的内存大小,需要考虑内存对齐的问题。这就是为什么sizeof(union test)的值为4啦。
C中使用union
说的再好,再多,终归都是要在使用的,下面就好好的说说C中使用union。和struct一样,union只有先定义了共用体变量才能引用它。而且不能直接引用共用体变量,而只能引用共用体变量中的成员。就像我上面定义的union test。我们不能像下面这样直接引用union:
复制代码 代码如下:
union test a;
printf("%d", a);
这种直接引用是错误的,由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。所以,应该写成下面这样:
复制代码 代码如下:
printf("%d", a.mark);
同时,在使用union的时候,我们还需要注意以下的几点:
1.同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。
2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:
复制代码 代码如下:
#include
using namespace std;
union test
{
char mark;
long num;
float score;
}a;
int main()
{
// cout<
a.mark = 'b';
cout<
cout<
cout<
a.num = 10;
cout<
cout<
cout<
a.score = 10.0;
cout<
cout<
cout<
return 0;
}
所以,在使用union的时候,要十二分的小心的。
3.由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。
4.不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。
5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。
按理说,总结到这里,C语言中的union也就没什么更多的要说了。但是,有一种东西叫做C++,在这个C++中有一种东西叫做类。
当union遇到对象
就单单C中的union,上面的总结已经够用了,但是,现在偏偏又有一个叫做C++的东西;当union遇到了C++中的对象时,一切又变得剪不断,理还乱。上面总结的union使用法则,在C++中依然适用。本来union本就是从C语言中的,如果我们在C++中继续按照C语言的那种方式使用union,那是没有问题的。如果我们在union中放一个类的对象呢?结果会怎么样?比如有以下代码:
复制代码 代码如下:
#include
using namespace std;
class CA
{
int m_a;
};
union Test
{
CA a;
double d;
};
int main()
{
return 0;
}
可以看到,没有问题;如果我们在再类CA中添加了构造函数,或者添加析构函数,我们就会发现程序就会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
结束的话
我们都在玩那些高大上的东西,猛回头,发现身后却又一个大坑。打开尘封了多年的《C语言程序设计》(谭浩强著),小心翼翼的拭去封面上的尘土,思绪立刻被拉回到大一。那些年,我那清纯的大一。对大学的憧憬,对计算机的好奇,对编程的未知,就是这本书,这本该死的《C语言程序设计》,把我带上了“程序猿”这条不归路。说多了,都是泪,当你看我这篇文章时,你应该懂我的。CodeMonkey~~~,这条不归路,且行且珍惜。
===修改日志===
2014年9月11日 删除了文中“不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。”这样的描述,非常感谢Cassie_Lcy的指正,而且还在评论中附上了验证代码,非常感谢;同时,我也非常抱歉,对于这点没有验证过的知识,就进行了总结,对大家造成了一定的误导,sorry。一定要注重求学的严谨性。
您可能感兴趣的文章:
union c语言什么意思,C语言、C++中的union用法总结(包懂)相关推荐
- C/C++语言中联合体union的妙用
联合体union的基本概念 在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int.一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元 ...
- 给定C语言数据结构,给定C语言的数据结构struct T { int w; union T { char c;int i;double d;)U; };...
给定C语言的数据结构struct T { int w: union T { char c:int i:double d:)U: }: 更多相关问题 HBV感染者的血清用电镜观察可见到_________ ...
- php union用法,C++_C语言、C++中的union用法总结,开始的话
已经好长时间没有 - phpStudy...
内存对齐的问题了).而对于union来说,在谭浩强的<C语言程序设计>中这么说:union变量所占用的内存长度等于最长的成员的内存长度.很显然,这是不对的,对于union所占用的内存大小, ...
- c语言union字节相同大小不同,C语言的struct/union字节对齐
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念: 1.数据类型自身的对齐值: 对于char型数据,其自 ...
- C语言union合并两个字节,C语言中的联合体union所占内存方式
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: 2)它的所有成员 ...
- C语言 C++中的union用法总结(包懂)
开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...
- c语言union内存大小,C语言、C++中的union用法总结
开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...
- c语言第一章,C语言修正版第一章
<C语言修正版第一章>由会员分享,可在线阅读,更多相关<C语言修正版第一章(28页珍藏版)>请在人人文库网上搜索. 1.C,语言,重要性,结构化编程语言,语言的入门课,基础课, ...
- 聊城大学c语言实验报告,c语言程序设计(包云)c第1章概述.ppt
c语言程序设计(包云)c第1章概述.ppt C语言程序设计,讲授包云 单位聊城大学计算机学院,第1章 C语言概述,3,主要内容,1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C语言的发展 ...
最新文章
- 华硕首款平板电脑周五开售
- 60分钟快速入门PyTorch
- Python eval 函数 - Python零基础入门教程
- 数据结构-排序基础代码
- 6.Hibernate多对多关系建立
- 黑马程序员——Java高新技术枚举和自动装箱
- 要实现动态加载JS脚本有4种方法:
- 色情版“微信”背后的秘密
- 在聊天群中,如何快速获取信息,了解群中讨论的话题。
- ArchLinux安装fcitx5-rime
- ACL(访问控制列表)
- 我在智联招聘上的行为测试
- 《从零开始搭建游戏服务器》Linux开发环境配置
- 【ArcGIS Pro二次开发】(7):地图(Map)的基本操作
- C语言预定义的标识符的作用,C语言标识符的分类
- 新房装修|选空调挂机还是中央空调?
- python的基础数据类型
- STM32——定时器中断实验
- c++,vector的erase循环删除
- C语言字符串中使用宏替换