共用体

转载 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
  • 9775

共用体union用法

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

什么时候使用共用体?

先应该明白为什么要使用共用体?共用体的作用是什么?简单来说:使用共用体的作用就是节省内存空间,那么在什么情况下使用共用体比较合适呢?        当数据项使用2种或者多种格式但又不会同时使...

(C语言)共用体union的用法举例

以前在学校学习C语言的时候一直搞不懂那个共用体union有什么用的。工作之后才发现它的一些妙用,现举例如下:1. 为了方便看懂代码。比如说想写一个3 * 3的矩阵,可以这样写:[注:下面用红色部分标记...

结构和共用体

我们知道一些C语言的基本数据类型,例如整型、单精度型、双精度型、字符型以及构造数据类型数组,这些数据类型在实际应用当中都是非常有效的,特别是数组,数组是把若干个类型相同的数据集合在一起便于整理和统计,...

HC-05蓝牙模块连接STC89C52单片机控制LED灯

**首先声明我用的是52单片机,板子型号为HC6800-ES V2.0;如果 非同类型,实现不了,概不认账。** 要实现这个玩法,首先得掌握串口通信的知识,不需要太多,只要知道如何接收...
  • W_K_L
  • W_K_L
  • 2017年05月21日 13:00
  • 1417

c中共用体简谈

共用体   P319-P324 共用体与结构体的区别:     结构体定义一个由多个数据成员组成的特殊类型,而共用体定义了一块所有数据成员共享的内存。 共用体的概念:     共用体,又名联合...

C代码之共用体(数据结构)

  • 2009年06月22日 11:24
  • 28KB
  • 下载

11_第11章结构体与共用体.ppt

  • 2015年02月19日 21:45
  • 387KB
  • 下载

C++ STL 内存分配的思想以及使用union(共用体)的妙处

今天看书《STL源码剖析》,shuzhong
  • dalleny
  • dalleny
  • 2014年09月01日 16:31
  • 1132
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共用体
举报原因:
原因补充:

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