【C语言】——union共用体

来源:互联网 发布:cadence软件仿真教程 编辑:程序博客网 时间:2024/06/06 07:30


    union,C语言中使用比较少的一个东西,其实并不复杂。本质上来说,他和结构体是一样的,只是在包装角度看有些差异。


    形式

    union 共用体名{

    数据类型 成员名;

    数据类型 成员名;

    ...

    }变量名;

    

    特点

    1.共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

    2.union中可以定义多个成员,union的大小由最大的成员的大小决定。

    3.对某一个成员赋值,会覆盖其他成员的值。

     当成员所占字节数不同时,只会覆盖相应字节上的值。例:char只占1个字节,而int占4个字节,则char类型数据只会覆盖int类型数据的低地址1字节。

    4.联合体union的存放顺序是所有成员都从低地址开始存放的。

     比如0x1234中,0x12是高地址,而0x34是低地址。


    实例

    有如下一段程序:

#include <stdio.h>main(){union{char c;int i;float a;}test;test.i=0x1234;test.c='A';printf("%x\n",test.i);}
    程序运行结果:1241 

    程序中先给i赋值,再给c赋值,因为i为int类型,而c为char类型,所以,当在给c赋值之后,会赋值原来已有的i的值,但又不足以完全覆盖,从而得到运行结果。


    与结构体区别

    1. 共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。

    2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。


    扩展

    union的赋值操作涉及到数据所占字符大小的问题,以下是在32位操作系统下的部分数据类型所占字节:

    1:整形

     int             4字节

     longint          4字节

     shortint          2字节

     unsignedint        4字节

     unsignedlong int     4字节

     unsignedshort int    2字节

    2:字符型

     char          1字节

     unsignedchar     1字节

    3:浮点型

     float        4字节

     double        8字节

     longdouble      8字节

     unsigned longdouble  8字节

     unsigneddouble      4字节
    4:字符串型

     string     32字节

    5:指针类型

     所有类型的指针都是   4字节


    ......




1 0