转自:http://blog.csdn.net/xiao3404/article/details/22276485

2.共用体

2.1共用体的概念

共用体是一种构造类型的数据结构。在一个“共用体”内可以定义多种不同的数据类型,这些变量共享同一段内存,已达到节省空间的目的,共用体内的变量互相覆盖。

定义共用体类型变量的一般形式:

union 共用体名

{

成员表列;

}变量表列;

例如:

  1. union data
  2. {
  3. int i;
  4. char ch;
  5. float f;
  6. }a,b;

可以看见,“共用体”与“结构体”的定义形式相似,但他们的含义不同。共用体的各成员变量在内存中的字节数可能不同,但这些变量都放在从同一个地址开始的内存单元中,共用体变量所占的内存长度等于最长的成员长度。变量在内存中的情况如下:

图 2 union变量内存分布

2.2共用体类型数据的特点

(1)同一个内存段内可以用来存放几种不同的数据类型,但是每一瞬时只能存放其中的一个数据,即每一个瞬时只有一个成员起作用,其他的成员不起作用。

(2)共用体变量中起作用的是最后一次存放的成员,每次只能赋一种值, 赋入新值则冲去旧值。

例如:

  1. b.ch = 'a';
  2. b.i = 0x00004241;
  3. printf("%c",b.ch);//结果:A

(3)共用体变量的地址和它的各成员的地址是同一个地址;

(4)共享内存从union的首地址开始放置,从最低地址开始覆盖

3.加深struct和union的理解

在此之前先简单介绍计算机中的两个术语:

大端模式,是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中。

小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。

在一般情况下x86结构是小端模式,本机就是如此!

  1. int data = 0x00004241;

在内存中它们存储的方式有两种:

图 3  大端模式

图 4  小端模式

看如下的代码:

  1. union number           /*定义一个联合*/
  2. {
  3. int i;
  4. struct
  5. {
  6. char first;
  7. char second;
  8. }half;             /*在联合中定义一个结构*/
  9. }num;
  10. num.i=0x00004241;      /*联合成员赋值*/
  11. printf("%c%c\n", num.half.first, num.half.second);
  12. num.half.first='a';    /*联合中结构成员赋值*/
  13. num.half.second='b';
  14. printf("%x\n", num.i);

输出结果:

AB

6261

分析与内存变化:

num.i = 0x00004241对应step1,num.half.first = 'a' num.half.second= 'b'对应step2,printf("%x\n",num.i)对应step3;由于在我的机器中是小端模式,故四字节的“61620000”代表的十六进制整数是“6261”。

图 5 内存变化过程

4.union中存放的数据类型

1.联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存

2.联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

5.共享内存特性的几种应用

  1. union data
  2. {
  3. int i;
  4. unsigned char c[4];
  5. float f;
  6. };
  7. union data a;//定义union类型的变量

1.在需要将浮点数据转移时,使用共同体,按4个字节的char型数据传输,带来通信效率的提高。

一般浮点数发送方法:是将浮点数放大一定的倍数,再取整,再按整数的高低位传输。还需要传输这个放大的倍数,如果浮点数是个负数的话,还要将符号一并发送。接收方收到这几条报文后,才能将数据还原。但是接收方还原的浮点数据与发送方发送的浮点数不一样,因为小数位数发生变化。使用共同体就不会出现这个问题了,在接收方,使用共同体,将收到到的4个char数据赋值给a.c数组,a.f就是还原的数据,这个数据和发送的数据是一样的,也不管发送的浮点数是正还是负。如有a.f = -12.34; 则a.c[0] = 0xa4, a.c[1] = 0x70, a.c[2] = 0x45, a.c[3] = 0xc1。如有a.c[0] = 0xa4, a.c[1] = 0x70, a.c[2]= 0x45, a.c[3] = 0xc1,则a.f =-12.34。使用这种方式传输浮点数,数据是不会丢失的,报文也更简单。

2.将浮点数保存到文件中时,保存为4个字节的char型数据,节约空间。如果保存为文本需要占用的字节数等于数值的字符的个数,有可能占用1~20字节,而用共用   体的char型数据,占用的空间大小固定为4字节,对大量浮点数据的存储,节约的空间更多,分析保存的浮点数也是很方便的。

3.用在强制类型转换上。如将int数据转为float,可以这样使用union: a.i =1234;赋值后,a.f就是转换后的值等于1234。

转:union 联合体(共用体)的更多相关文章

  1. (转)C语言union(联合体 共用体)

    一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...

  2. C语言:结构体和联合体(共用体)

    结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...

  3. 【C++】共用体\联合体(union)

    共用体的用法与结构体差不多,只不过将关键字由struct变成了union.共用体使不同的类型变量存放到同一段内存单元中,所以共用体在同一时刻只能存储一个数据成员的值,共用体的大小等于最大成员的大小(结 ...

  4. [c/c++] programming之路(27)、union共用体

    共用体时刻只有一个变量,结构体变量同时并存 一.创建共用体的三种形式 #include<stdio.h> #include<stdlib.h> #include<stri ...

  5. 【C语言入门教程】7.4 共用体

    7.4 共用体 共用体又称为联合体,是由不同的数据类型组成的一个整体.与结构体不同的是,共用体每次只能使用其中一个成员.结构体的总长度是结构体所有成员长度之和,共用体的总长度是其中最长一个数据类型的长 ...

  6. 5、数组&字符串&结构体&共用体&枚举

    程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...

  7. C学习笔记(6)--- 共用体,位域深入

    1.共用体(Union): 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置 ...

  8. C语言共用体(Union)

    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: uni ...

  9. typedef,结构体,共用体,联合体

    typedef的用途: 封装数据类型,方便移植 简化函数指针的定义 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/ ...

随机推荐

  1. YTU 2986: 删除区间内的元素(线性表)

    2986: 删除区间内的元素(线性表) 时间限制: 1 Sec  内存限制: 2 MB 提交: 8  解决: 3 题目描述 若一个线性表L采用顺序存储结构,其中元素都为整数.设计一个算法,删除元素值在 ...

  2. Android开发之Theme、Style探索及源码浅析

    1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...

  3. ocruntime

    原作: http://www.jianshu.com/p/25a319aee33d 三种方法的选择 Runtime提供三种方式来将原来的方法实现代替掉,那该怎样选择它们呢? Method Resolu ...

  4. android 入门 005(登录记住)

    android 入门 005(登录记住) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  5. Objective-C之null NaN undefined

    http://blog.csdn.net/siemenliu/article/details/6568306

  6. shell 中的>文件重定向符 和 标准输入、输出、错误以及 2&1 的含义*

    http://www.cnblogs.com/chenmh/p/5382044.html 问:其中 的2>&1是怎么回事? . test.sh > test.log 2>&a ...

  7. log4j.properties详解与例子

    在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Appender及 ...

  8. 取出ip address control的ip字符

    1.给这个空间设置control型变量 m_add; 2.定义4个字节型变量,来获取控件中的4个ip字节 BYTE a,b,c,d: m_add.GetAddress(a,,b,c,d): 3.定义I ...

  9. Dev gridview新增一行自动获得焦点并打开编辑模式

    1.gridview添加一行自动获得焦点实现方式: 关键代码: GarsonZhang dt.Rows.Add("1", "2"); gridView1.Foc ...

  10. Linux链接库三(C跟C++之间动态库的相互调用)

    http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http ...