C 语言中的 union

由于 C 语言是强类型语言,不能如同某些语言一样,可以在变量中存储任意元素。所以在有的时候会遇到一些问题。比如你有一个变量需要存储计算结果,计算结果有时可能是整数,有时可能是浮点数。这里我们介绍其中可以做到不更改变量名就可以存储不同类型数据的变量。

1. 声明 union

和之前介绍的 struct 的声明方式是类似的,通过关键字 union ,以及这个 union 的名称,还有一系列的变量类型以及名称。

union Calculation
{
    int i;
    float f;
    char str[100];
};

union Calculation cal1, cal2;

看着结构感觉是不是很熟悉。但是这和 struct 有着本质的不同。之前的 struct 是一个集合,里面的变量之间是独立的。而这个 union 则正好相反,这不是一个集合,而只是一个特殊的变量,是一个,不是多个。只不过这个变量可以在其声明包含的这些变量类型之间变化。一次只能有一个内部的变量类型被赋值,如果多次赋值,那么最后一次的赋值会覆盖前面的变量内容。

2. 初始化 union

初始化一个 union 和初始化一个变量是一致的,只能初始化里面其中一个值,一般默认形式是初始化其中的第一个值。

union Calculation cal1 = 1;

3. 使用 union

使用一个 union 变量需要使用成员访问符,也就是英文句号 .

cal1.i = 1;

4. 示例程序

#include <stdio.h>
#include <string.h>

int main()
{
    union Calculation {
        int i;
        float f;
        char str[100];
    };

    union Calculation cal1 = {1};

    printf("cal1.i: %d, cal1.f: %f, cal1.str: %sn", cal1.i, cal1.f, cal1.str);

    cal1.f = 0.111;

    printf("cal1.i: %d, cal1.f: %f, cal1.str: %sn", cal1.i, cal1.f, cal1.str);

    strcpy(cal1.str, "None");

    printf("cal1.i: %d, cal1.f: %f, cal1.str: %sn", cal1.i, cal1.f, cal1.str);

    return 0;
}

运行结果:

cal1.i: 1, cal1.f: 0.000000, cal1.str: 
cal1.i: 1038308344, cal1.f: 0.111000, cal1.str: S=
cal1.i: 1701736270, cal1.f: 70373527000468267466752.000000, cal1.str: None

在这个示例中我们展示了其用法。可以看到初始化的时候只能给第一种类型的变量赋值,后面的每次赋值都会覆盖其他类型的值。所以只有最后一次的赋值的类型是可以使用的。这和之前介绍的 struct 是完全不同的。

5. 小结

到这里可能有些同学不解其中缘由,其实不复杂,主要是两个在内存的存储分配上是不同的。之前的 struct 是给每一种类型的变量都存储的存储空间,而 union 则只是按照类型里需要内存最多的类型分配了一个内存存储位置。因为只有一个存储位置,所以就会出现后面的会覆盖掉之前存储的内容的情况。