当前位置:  编程技术>c/c++/嵌入式

C语言、C++中的union用法总结

    来源: 互联网  发布时间:2014-10-29

    本文导语:  开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这...

开始的话

已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结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

    
 
 

您可能感兴趣的文章:

  • 数据库 iis7站长之家
  • kliyx是使用C++语言编程的,还是用C语言编程的?
  • C++元模板语言 Metacza
  • linux中学习c++是不是比学习c语言用处要少?
  • C++脚本语言 ChaiScript
  • linux嵌入式开发语言用C还是C++?
  • 深入理解:Java是类型安全的语言,而C++是非类型安全的语言
  • C++语言的SQLite 接口库 sqlitexx
  • C++语言的SSH客户端库 NetSieben SSH Library
  • 有关Linux下用eclipse写C++语言程序的编译问题
  • Linux下C语言编程可以调用C++类库吗?
  • 项目需要,麻烦有做过Linux平台c++语言多线程开发的同学进来看下
  • linux新手想请问大家你们在linux下通常用什么开发语言和工具(C多点还是C++多点还是pascal ?还有工具方面?)
  • 准备从Windows转向Linux的软件开发,语言为C++,怎么入门?
  • 如何用C++语言实现以http的post方式提交数据到服务器
  • 怎样用c或c++语言编写一个程序定时访问某个网站,并登录?
  • 捡分大好时机,比较C++和Java这两种语言
  • FreeBSD下C++语言工程文件的编译问题
  • 在LINUX下怎样编写C++语言?(新手在线等待)
  • 探讨register关键字在c语言和c++中的差异
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 关于C语言中的一些用法,高手进
  • HTML 脚本语言介绍及<script>标签用法
  • C语言变量类型与输出控制用法实例教程
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • C语言中char*和char[]用法区别分析
  • c语言中static和extern的用法详细解析
  • C语言中qsort函数用法实例小结
  • C语言入门之指针用法教程
  • 浅析C语言中assert的用法
  • C语言中字符串常用函数strcat与strcpy的用法介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C语言指针学习经验总结浅谈
  • C语言中函数与指针的应用总结
  • C语言字符串操作总结大全(超详细)
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • c语言实现MD5算法完整代码示例
  • 动态编程语言 LIME编程语言
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • C语言如何改变当前语言环境
  • c语言基于libpcap实现一个抓包程序过程
  • 如何在VIM中使汇编语言和C语言自动缩进?
  • HTML超文本标记语言教程及实例
  • 我安装的linux时默认语言选择的是中文,又乱码,怎么可以解决?怎么更改默认语言成英文?
  • MD5算法的C语言实现
  • Redhat9安装时语言只选择了中文,现在还能再增加其它语言的支持吗?如英文
  • HTML 超文本标记语言简介
  • 请问哪里有ubuntu 9.0版本的中文语言包和KDE的中文语言包下载,我用Google搜索了很多地方都没有!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3