共用体

转载 2012年03月27日 00:05:17

有时需要使几种不同类型的变量存放到同一段内存单元中。例如可以一个整形变量,一个字符型变量,一个实型变量放在同一地址开始的内存单元中。以上3个变量在内存单元中占的字节数不同,但是都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。

共用体也是一种构造数据类型,它是将不同类型的变量存放在同一内存区域内。共用体也称为联合(union)。共用体的类型定义、变量定义及引用方式与结构相似,但它们有着本质的区别:结构变量的各成员占用连续的不同存储空间,而共用体变量的各成员占用同一个存储区域。

1.共用体变量的定义

共用体变量的定义与结构变量定义相似,首先,必须构造一个共用体数据类型,再定义具有这种类型的变量。

共用体类型定义的一般方法:

union 共用体名 { 共用体成员表 } ;

其中,共用体成员表是对各成员的定义,形式为:类型说明符 成员名;

与定义结构变量一样,定义共用体变量的方法有以下三种:

1先定义共用体类型,再定义该类型数据

例如:

        union data {

        char n[10];

        int a;

        double f;};

      union data x,y[10];

2)在定义共用体类型的同时定义该类型变量

例如:

       union data {

        char n[10];

        int a; double f; }x,y[10];

3不定义共用体类型名,直接定义共用体变量

例如:

       union {

        char n[10];

        int a;

        double f; }x,y[10];

         定义了共用体变量后,系统就给它分配内存空间。因共用体变量中的各成员占用同一存储空间,所以,系统给共用体变量所分配的内存空间为其成员中所占用内存空间最多的成员的单元数。共用体变量中各成员从第一个单元开始分配存储空间,所以各成员的内存地址是相同的。例如上述共用体data的变量x的内存分配如图9.14所示,它占用10个字节的内存单元。


图9.14 共用体变量x的内存空间分配

2.共用体变量的引用

定义了共用体变量后,即可使用它。若需对共用体变量初始化,只能对它的第一个成员赋初始值。

例如:union data x={"zhangsan"};是正确的,而union data x={"zhangsan",12,40000, 78,5};是错误的。

虽然共用体数据可以在同一内存空间中存放多个不同类型的成员,但在某一时刻只能存放其中的一个成员,起作用的是最后存放的成员数据,其他成员不起作用,如引用其他成员,则数据无意义。

例如,对data类型共用体变量,有以下语句:

x.a=100;  strcpyx.n,"zhangsan";  x.f=90.5;

则只有x.f是有效的,x.ax.n目前数据是无意义的,因后面的赋值语句将前面共用体数据覆盖了。

9.10  析下列程序的输出结果,用共用体数据的特性给以正确的解释。

/* 9-10源程序,析程序的输出结果。 */

#include <stdio.h>

#include <string.h>

void main()

{  

union bt {  int k; char c[3];} a;

 

    a.k=0;

strcpy(a.c,"AB");    //8

printf("%o , %o\n",a.c[0],a.c[1]);

printf("%d\n",a.k);    

    a.k=2;                 // 11

printf("%o , %o, %o \n",a.c[0],a.c[1],a.c[2]);

printf("%d\n",a.k);    

}

程序执行:

101 , 102

16961

2 , 0, 0

Press any key to continue

程序说明:共用体变量a共占用4个字节的存储空间,执行第8行语句后,a所对应的存储区域中的数据如图9.15a)所示。


图9.15 共用体变量a的内存空间分配

这时a的成员数组3字节被赋值为字符串“AB”,对应的各字符的ASCII码值分别存放在a的对应空间中,因a的成员k与成员c所占用的内存单元是重叠的,所以将前3字节作为a.c。同样,执行程序的第11行后,a所对应的存储区域中的数据如图             9.15b)所示,a的成员k被赋值为2,将刚才a中的数据覆盖了,执行下一语句后输出的是2的内存存放形式的八进制数据,整型数据在内存中的存放原则是低位字节在前,高位字节在后。

共用体union详解

一共用体的概念 当需要把不同类型的变量存放到同一段内存单元或对同一段内存单元的数据按不同类型处理则 需要使用共用体数据结构 例把一个整型变量一个字符型变量一个实型变量放在同一个地址开始的内存单元中 共...
  • kobesdu
  • kobesdu
  • 2014年07月28日 13:23
  • 11441

C 结构体与共用体的用法

C 结构体与共用体的用法 struct(结构体) C 语言允许用户建立有不同类型数据组成的组合型的数据结构,它成为结构体(structure)。 建立自己的结构体 结构...
  • qq_34882983
  • qq_34882983
  • 2016年12月19日 23:34
  • 1161

共用体的作用

共用体的用处一直不太了解CPP中共用体的作用,查了一下,下文是对共用体作用的总结。...
  • kevinzhan0417
  • kevinzhan0417
  • 2016年01月27日 11:21
  • 573

[C++] Union共用体示例讲解

/* * UnionLab.cpp * * Created on: Nov 29, 2014 * Author: sodino */ #include using name...
  • sodino
  • sodino
  • 2014年11月29日 20:53
  • 2345

C++ 共用体:union

union主要是将各种类型的数据存放在一段固定的存储器中,存储器的大小由union中需要最大存储器的数据类型决定。 如: union student { char ***; int age; long...
  • Harold_Finch
  • Harold_Finch
  • 2017年03月23日 15:39
  • 98

共用体union用法

需要4轴开源pcb 代码请联系495527583 共用体union用法 一、 联合说明和联合变量定义      联合也是一种新的数据类型, 它是一种特殊形式的...
  • chenyang19870806
  • chenyang19870806
  • 2016年11月11日 11:56
  • 398

union 共用体声明和共用体变量定义

共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字union来定义 共用体(有些人也叫"联合")声明和共用体变量定义与结构体十分相似。其形式为: union 共用体名{ 数据类型 ...
  • jake2012
  • jake2012
  • 2014年05月06日 16:38
  • 612

C语言数据类型之共用体

1.定义: 在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。这几个不同的变量共同占用同一段内存结构。 对于共用体变量,系统按该变量中各共用体成员中所需空间最大的那...
  • yuandm819
  • yuandm819
  • 2016年04月07日 17:49
  • 1013

结构体和共用体的使用及注意事项

一、结构体 1.结构体的作用 在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流,而是多种数据组合起来的一个整体,其表现形式就是一个结构体。 2.结构体的定义 结构体...
  • zhengqijun_
  • zhengqijun_
  • 2016年07月25日 11:07
  • 3701

数据结构学习之 union 共用体(union 到底有什么用?)

1、引言共用体常用来节省内存,特别是一些嵌入式编程,内存是非常宝贵的! 共用体也常用于操作系统数据结构或硬件数据结构! union 在操作系统底层的代码中用的比较多,因为它在内存共享布局上方便且直...
  • xy010902100449
  • xy010902100449
  • 2015年09月08日 16:11
  • 1462
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共用体
举报原因:
原因补充:

(最多只允许输入30个字)