Union 结构

    C 语言提供了 Union 结构,用来自定义可以灵活变更的数据结构。它内部包含各种属性,但是所有属性共用一块内存,导致这些属性都是对同一个二进制数据的解读,其中往往只有一个属性的解读是有意义的。并且,后面写入的属性会覆盖前面的属性,这意味着同一块内存,可以先供某一个属性使用,然后再供另一个属性使用。这样做的最大好处是节省内存空间。

    上面示例中,命令定义了一个包含三个属性的数据类型quantity。虽然包含三个属性,但是只能写入一个值,三个属性都是对这个值的不同解读。最后赋值的属性,往往就是可以取到有意义的值的那个属性。

    使用时,声明一个该类型的变量。

    1. // 写法一
    2. union quantity q;
    3. q.count = 4;
    4. // 写法二
    5. union quantity q = {.count=4};
    6. // 写法三

    上面代码展示了为 Union 结构赋值的三种写法。最后一种写法不指定属性名,就会赋值给第一个属性。

    如果要让q.weight属性可以取到值,就要先为它赋值。

    1. printf("weight is %f\n", q.weight); // weight is 0.5

    一旦为其他属性赋值,原先可以取到值的q.count属性就跟着改变,使用它可能就没有意义了。除了这一点,Union 结构的其他用法与 Struct 结构,基本上是一致的。

    Union 结构也支持指针运算符->

    上面示例中,ptrq的指针,那么ptr->count等同于q.count

    1. union foo {
    2. int a;
    3. float b;
    4. } x;
    5. x.a = 12;
    6. printf("%d\n", x.a); // 12
    7. printf("%d\n", *foo_int_p); // 12
    8. x.b = 3.141592;
    9. printf("%f\n", x.b); // 3.141592
    10. printf("%f\n", *foo_float_p); // 3.141592

    上面示例中,&x是 foo 结构的指针,它的数据类型完全由当前赋值的属性决定。

    typedef 命令可以为 Union 数据类型起别名。

    上面示例中,union命令定义了一个包含三个属性的数据类型,typedef命令为它起别名为。

    Union 结构的好处,主要是节省空间。它将一段内存空间,重用于不同类型的数据。定义了三个属性,但同一时间只用到一个,使用 Union 结构就可以节省另外两个属性的空间。Union 结构占用的内存长度,等于它内部最长属性的长度。