C 共用体

  • Post category:C

当我们需要将不同类型的数据存储在同一内存空间时,可以使用C语言中的共用体(union)。共用体允许多个成员共享同一内存空间。

创建共用体

共用体的创建方式与结构体类似,使用 union 关键字声明,并在大括号中定义成员。

union myUnion {
    int i;
    float f;
    char s[10];
};

以上创建了一个名为 myUnion 的共用体,包含一个 int 类型的成员 i,一个 float 类型的成员 f 和一个字符数组类型的成员 s

访问共用体成员

共用体的成员使用方式与结构体相似,用 . 运算符可以访问共用体的成员。

union myUnion u;
u.i = 10;
printf("i = %d\n", u.i);

u.f = 3.14;
printf("f = %f\n", u.f);

strcpy(u.s, "Hello");
printf("s = %s\n", u.s);

以上代码创建了一个名为 u 的共用体,并依次设置了 ifs 三个成员的值,并输出。

由于共用体的所有成员共享同一内存空间,对共用体任何一个成员的修改都会影响共用体内的所有成员。

共用体应用示例

1. 破解密码

共用体可以用于破解密码,如将输入的密码使用一个共用体转换成 int 类型,然后与保存的密码进行比较。

union Password {
    int i;
    char str[5];
};

int main() {
    union Password pwd;
    pwd.i = 5963;

    char input[5];
    printf("请输入密码:");
    scanf("%s", input);

    if (pwd.i == atoi(input)) {
        printf("密码正确!\n");
    } else {
        printf("密码错误!\n");
    }

    return 0;
}

以上代码创建了一个名为 Password 的共用体,包含一个 int 类型的成员 i 和一个长度为5的字符数组类型的成员 str。程序通过将 5963 赋值给 i 的方式创建了一个长度为4的密码,并通过 scanf 函数接受用户输入的密码,并通过 atoi 函数将输入的字符转换成 int类型,然后与 5963 进行比较,判断输入的密码是否正确。

2. 节省内存

共用体还可以用于节省内存,如一个数据结构需要同时存储 intfloat 类型的变量,但因空间限制只能存储一个变量,此时可以使用共用体。

struct Data {
    char name[10];
    union {
        int i;
        float f;
    } value;
};

int main() {
    struct Data d;

    strcpy(d.name, "counter");
    d.value.i = 10;
    printf("%s = %d\n", d.name, d.value.i);

    d.value.f = 3.14;
    printf("%s = %f\n", d.name, d.value.f);

    return 0;
}

以上代码创建了一个名为 Data 的结构体,包含一个长度为10的字符数组类型的成员 name 和一个以共用体作为类型的成员 valuevalue 成员包含一个 int 类型的成员 i 和一个 float 类型的成员 f。程序通过将 10 赋值给 i 的方式,将 "counter" 赋值给 name 的方式同时存储了一个 int 类型和一个 char 类型的变量,通过将 3.14 赋值给 f 的方式,改为存储了一个 float 类型的变量,并分别输出存储在 Data 结构体中的两种不同类型的变量。