【C语言】union 关键字

在C语言中,union关键字用于定义联合体。联合体是一种特殊的数据结构,它允许不同的数据类型共享同一段内存。所有联合体成员共享同一个内存位置,因此联合体的大小取决于其最大成员的大小。

定义和使用联合体

基本定义

定义一个联合体类型时,需要使用union关键字,后跟联合体的名称和成员的定义。

c 复制代码
#include <stdio.h>

// 定义一个联合体类型
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    // 声明一个联合体变量
    union Data data;

    // 赋值给联合体成员
    data.i = 10;
    printf("data.i: %d\n", data.i);

    data.f = 220.5;
    printf("data.f: %.2f\n", data.f);

    strcpy(data.str, "C Programming");
    printf("data.str: %s\n", data.str);

    // 注意:联合体成员共享内存,赋值一个成员会影响其他成员的值
    printf("data.i: %d\n", data.i);
    printf("data.f: %.2f\n", data.f);

    return 0;
}

在这个例子中,定义了一个名为Data的联合体类型,它包含三个成员:ifstr。在main函数中,声明了一个Data类型的变量data,并对其成员进行了赋值和访问。

共享内存

联合体的一个重要特性是所有成员共享同一块内存,因此一个成员的值会覆盖其他成员的值。

c 复制代码
#include <stdio.h>
#include <string.h>

// 定义一个联合体类型
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;

    data.i = 10;
    printf("data.i: %d\n", data.i);

    data.f = 220.5;
    printf("data.f: %.2f\n", data.f);

    strcpy(data.str, "C Programming");
    printf("data.str: %s\n", data.str);

    // 因为最后一次赋值的是str,所以i和f的值会被覆盖
    printf("data.i: %d\n", data.i);  // 未定义的行为
    printf("data.f: %.2f\n", data.f);  // 未定义的行为

    return 0;
}

在这个例子中,由于联合体成员共享内存,最后一次赋值data.str会覆盖之前的data.idata.f的值,因此访问这些成员的值会导致未定义行为。

使用typedef简化联合体

使用typedef可以简化联合体的使用,使得在声明变量时不需要每次都使用union关键字。

c 复制代码
#include <stdio.h>
#include <string.h>

// 使用typedef定义联合体类型
typedef union {
    int i;
    float f;
    char str[20];
} Data;

int main() {
    // 声明一个联合体变量
    Data data;

    data.i = 10;
    printf("data.i: %d\n", data.i);

    data.f = 220.5;
    printf("data.f: %.2f\n", data.f);

    strcpy(data.str, "C Programming");
    printf("data.str: %s\n", data.str);

    return 0;
}

在这个例子中,使用typedefunion Data定义了一个别名Data,这样在声明变量时就不需要使用union关键字了。

联合体的大小

联合体的大小等于其最大成员的大小,因为所有成员共享同一块内存。

c 复制代码
#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    printf("Size of union: %zu bytes\n", sizeof(union Data));
    return 0;
}

在这个例子中,sizeof运算符用于计算联合体的大小。

示例程序

以下是一个包含多种用法的综合示例:

c 复制代码
#include <stdio.h>
#include <string.h>

typedef union {
    int i;
    float f;
    char str[20];
} Data;

int main() {
    Data data;

    data.i = 10;
    printf("data.i: %d\n", data.i);

    data.f = 220.5;
    printf("data.f: %.2f\n", data.f);

    strcpy(data.str, "C Programming");
    printf("data.str: %s\n", data.str);

    // 由于最后一次赋值的是str,所以i和f的值会被覆盖
    printf("data.i: %d\n", data.i);  // 未定义的行为
    printf("data.f: %.2f\n", data.f);  // 未定义的行为

    return 0;
}

在这个示例中,data联合体的成员被依次赋值并打印,最后一次赋值data.str覆盖了之前的成员值,导致对data.idata.f的访问结果未定义。

联合体的应用场景

  1. 节省内存:在某些情况下,可以使用联合体节省内存。例如,当一个变量在不同的时间需要存储不同类型的数据时,可以使用联合体来节省内存空间。

  2. 类型转换:联合体可以用于实现不同类型之间的转换。

c 复制代码
#include <stdio.h>

typedef union {
    float f;
    unsigned int i;
} FloatIntUnion;

int main() {
    FloatIntUnion u;
    u.f = 3.14f;
    printf("Float value: %f\n", u.f);
    printf("As unsigned int: %u\n", u.i);
    return 0;
}

在这个例子中,联合体用于查看同一段内存在不同类型下的表示。

总结

union关键字在C语言中用于定义联合体,允许不同的数据类型共享同一段内存。联合体的大小由其最大成员的大小决定。联合体在节省内存和类型转换等场景中非常有用。尽管联合体的使用可能导致一些成员值的未定义行为,但在特定的应用场景下,联合体依然是一个强大的工具。

相关推荐
持力行4 小时前
从C struct到C++中的class
c语言·c++
2501_914245939 小时前
C语言设计模式详解:从理论到实践的完整指南
c语言·开发语言·设计模式
2501_9142459312 小时前
C语言与硬件交互:从GPIO到中断的嵌入式编程实践
c语言·单片机·交互
炸膛坦客13 小时前
单片机/C/C++八股:(二十四)编译文件( .bin 和 .hex ,包括 .elf 和 .axf )
c语言·c++·单片机
简单电磁炮15 小时前
硬件基础4
c语言
炸膛坦客17 小时前
单片机/C/C++八股:(二十三)#define 和 typedef 的区别
c语言·c++·单片机
捷瑞电子工坊19 小时前
C语言取地址符 `&` 极简教程
c语言·c语言基础·取地址符·指针入门
乱七八糟的屋子20 小时前
LibYAML超全教程-C语言YAML解析与生成
c语言·开发语言·配置文件·yaml解析·libyaml·开源库实战
小肝一下20 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~20 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表