首页 > 编程笔记 > C语言笔记 阅读:2

C语言union联合体用法详解(附带实例)

C语言的联合体看起来很像结构体,只不过关键字由 struct 变成了 union。联合体和结构体的区别在于,结构体定义了一个由多个数据成员组成的特殊类型,而联合体定义了一块为所有数据成员共享的内存。

联合体也称为共用体,它使几种不同类型的变量存放到同一段内存单元中。联合体在某一时刻只能有一个值,即某个数据成员的值。由于所有成员共用同一块内存,因此联合体的大小就等于最大成员的大小。

定义联合体的类型变量的一般形式如下:
union 联合体名
{
     成员列表
}变量列表;

例如,下面的代码定义一个联合体,包括的数据成员有整型、字符型和实型:
union DataUnion
{
    int iInt;
    char cChar;
    float fFloat;
}variable; /*定义共用体变量*/
其中,variable 为定义的联合体变量,而 union DataUnion 是联合体类型。联合体也可以像结构体那样,将类型的声明和变量的定义分开:
union DataUnion variable;
可以看到,联合体和结构体定义变量的方式很相似。需要注意的是,结构体变量的大小是其所包括的所有数据成员大小的总和,其每个成员都有自己的内存单元;联合体的大小则为所包含数据成员中最大内存长度的大小。例如,上面定义的联合体变量 variable 的大小就与 float 类型的大小相等。

C语言联合体变量的引用

共用体变量定义完成后,就可以引用其中的数据成员,引用形式为“共用体变量.成员名”。

例如,引用前面定义的 variable 变量中的成员数据,代码如下:
variable.iInt;
variable.cChar;
variable.fFloat;
注意,不能在输出语句中直接引用共用体变量,如“printf("%d", variable);”。

【实例】选择一种交通工具回家。公司员工下班乘车可以坐公交,也可以坐地铁。设计一个交通工具的联合体,让员工进行选择。在本实例中定义联合体变量,通过定义的显示函数,引用联合体中的数据成员。
#include "stdio.h"
#include <string.h>

struct bus /*声明公交车结构体类型*/
{
    char name[64];
};

struct subway /*声明地铁结构体类型*/
{
    char name[64];
};

union Transportation /*声明公共交通共用体类型*/
{
    struct bus p;
    struct subway c;
};

int main()
{
    union Transportation t; /*定义一个共用体*/
    strcpy(t.p.name, "地铁"); /*将相应的名字复制给相应的变量*/
    strcpy(t.c.name, "公交车");
    printf("员工选择%s\n", t.p.name); /*输出信息*/
    printf("员工选择%s\n", t.c.name);
    return 0;
}
在程序中改变联合体的一个成员,其他成员也会随之改变。当给某个特定的成员进行赋值时,其他成员的值也会具有一致的含义,这是因为它们的值的每一个二进制位都被新值所覆盖。

运行程序,结果为:

员工选择公交车
员工选择公交车

C语言联合体变量的初始化

定义联合体变量时,可以同时进行初始化操作。同样,初始化值需要放在一对大括号中。

注意,对联合体变量初始化时,只需要一个初始化值就足够了,其类型必须和联合体的第一个成员的类型相一致。如果联合体的第一个成员是一个结构体类型,则初始化值中可以包含多个用于初始化该结构体的表达式。

【实例】字符型和整型的亲密关系。在本实例中,在定义共用体变量的同时进行初始化操作,并将引用变量的值输出。
#include<stdio.h>
union DataUnion /*声明共用体类型*/
{
    int iInt; /*成员变量*/
    char cChar;
};

int main()
{
    union DataUnion Union={97}; /*定义共用体变量,并进行初始化*/
    printf("iInt: %d\n",Union.iInt); /*输出成员变量数据*/
    printf("cChar: %c\n",Union.cChar);
    return 0;
}
运行程序,结果为:

iInt: 97
cChar: a

C语言联合体的使用注意事项

在使用联合体类型时,需要注意以下特点:

相关文章