C Union类型


union是一种在不同时间可以保存不同类型和不同大小数据的自定义数据类型。


union的所有成员使用相同的内存区。union提供了一种在同一块内存中操作不同类型数据的方法。

定义union和访问union成员

定义union有3种方式:

union union_tag {
  data_type1 member_name1;
  data_type2 member_name2;
  ...
};

union [union_tag] {
  data_type1 member_name1;
  data_type2 member_name2;
  ...
} union_var1, union_var2, ...;

typedef union [union_tag] {
  data_type1 member_name1;
  data_type2 member_name2;
  ...
} union_data_type;

第1和第2种方式中的union_tag是可选的。

第2种方式,在定义union类型的同时,可以声明一或多个union类型的变量union_var1, union_var2, ...

第3种方式,在定义union类型的同时,定义一个新的数据类型union_data_type

访问union成员有2种方式:

  • 如果union_var不是指针变量,使用.操作符,union_var.member_name
  • 如果union_pointer是指向union类型的指针,使用->操作符,union_pointer->memeber_name

union只能初始化为第一个成员的值。

下面是定义union和访问union成员的例子:

#include <stdio.h>
int main(int argc, const char * argv[]) {
    union u {
        char s[10];
        int i;
    };

    union u u1 = {"apple"};
    printf("fruit : %s \n", u1.s);  // apple

    u1.i = 10;
    printf("fruit2 : %d \n", u1.i); // 10

    union  {
        char s[10];
        int i;
    } u2 = {"red"};

    printf("color : %s \n", u2.s);  // red

    typedef union {
        char s[10];
        int i;
    } u;

    u u3 = {"dog"};
    printf("pet : %s \n", u3.s);  // dog

    u3.i = 10;
    printf("weight : %d \n", u3.i); // 10

    return 0;
}

union大小

union类型的大小(size)是最大成员的大小。

下面是union大小的例子:

#include <stdio.h>
int main(int argc, const char * argv[]) {
    union {
        char *s;
        int i;
    } u;

    printf("size of union : %lu \n", sizeof(u));  // 8

    return 0;
}

在上面的例子中,成员s是指针变量,占用8个字节,i是int类型变量,占用4个字节,因此union的大小就是8。

union数组

union数组的定义方式和int等基本数据类型一样。

下面是union数组的例子:

#include <stdio.h>
int main(int argc, const char * argv[]) {
    union u {
        char s[10];
        int i;
    };

    union u a[2] = {"apple", "banana"};
    printf("fruit : %s \n", a[1].s);  // banana

    union  {
        char s[10];
        int i;
    } a2[2] = {"red", "blue"};

    printf("color : %s \n", a2[1].s); // blue

    typedef union {
        char s[10];
        int i;
    } u;

    u a3[2] = {"dog", "cat"};
    printf("pet : %s \n", a3[1].s); // cat

    a3[1].i = 10;
    printf("weight : %d \n", a3[1].i);  // 10

    return 0;
}

指向union的指针

指向union的指针的定义方式和其它指针的定义方式一样。

下面是指向union的指针的例子:

#include <stdio.h>
int main(int argc, const char * argv[]) {
    union u {
        char *s;
        int i;
    } c, *p;

    c.s = "red";
    p = &c;
    printf("color : %s \n", p->s);  // red

    c.i = 10;
    printf("color : %d \n", p->i);  // 10

    return 0;
}