C 共用体代码实例

C 共用体的基本概念

共用体(Union)是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。共用体的所有成员共享同一块内存空间,大小由最大的成员决定。共用体的定义方式与结构体类似,但关键字为 union

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

共用体的内存分配

共用体的内存大小等于其最大成员的大小。例如,以下共用体的内存大小为 20 字节(char str[20] 的大小)。

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

共用体的基本使用

共用体的成员可以通过成员运算符 . 访问。由于共用体的特性,同一时间只能使用一个成员。

#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: %f\n", data.f);

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

    return 0;
}

共用体与结构体的区别

结构体的每个成员占用独立的内存空间,而共用体的所有成员共享同一块内存。以下是一个结构体和共用体的对比示例:

#include <stdio.h>

struct SData {
    int i;
    float f;
    char str[20];
};

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

int main() {
    printf("Size of struct SData: %lu\n", sizeof(struct SData));
    printf("Size of union UData: %lu\n", sizeof(union UData));

    return 0;
}

输出:

Size of struct SData: 28
Size of union UData: 20

共用体的实际应用

共用体常用于节省内存或实现数据的多态存储。例如,在嵌入式系统中,可以用共用体存储不同类型的数据:

#include <stdio.h>

typedef union {
    int raw;
    struct {
        unsigned int flag1 : 1;
        unsigned int flag2 : 1;
        unsigned int value : 14;
    } bits;
} SensorData;

int main() {
    SensorData data;
    data.raw = 0xABCD;

    printf("flag1: %u\n", data.bits.flag1);
    printf("flag2: %u\n", data.bits.flag2);
    printf("value: %u\n", data.bits.value);

    return 0;
}

共用体与类型转换

共用体可以用于实现数据的类型转换,例如将浮点数转换为整数的字节表示:

#include <stdio.h>

union FloatToBytes {
    float f;
    unsigned char bytes[4];
};

int main() {
    union FloatToBytes converter;
    converter.f = 3.14159;

    printf("Float: %f\n", converter.f);
    printf("Bytes: %02X %02X %02X %02X\n",
           converter.bytes[0],
           converter.bytes[1],
           converter.bytes[2],
           converter.bytes[3]);

    return 0;
}

共用体在协议解析中的应用

在通信协议中,共用体可以用于解析不同格式的数据包。例如:

#include <stdio.h>

typedef union {
    struct {
        unsigned char type;
        unsigned short length;
        unsigned char data[128];
    } packet;

    unsigned char raw[132];
} ProtocolPacket;

int main() {
    ProtocolPacket pkt;
    pkt.packet.type = 0x01;
    pkt.packet.length = 128;

    printf("Packet size: %lu\n", sizeof(ProtocolPacket));
    printf("Raw data size: %lu\n", sizeof(pkt.raw));

    return 0;
}

共用体的注意事项

共用体的使用需要注意以下几点:

  • 同一时间只能有一个成员有效。
  • 对共用体的一个成员赋值会影响其他成员的值。
  • 共用体的初始化只能针对第一个成员。
#include <stdio.h>

union Test {
    int a;
    float b;
};

int main() {
    union Test t = {10}; // 只能初始化第一个成员
    printf("t.a: %d\n", t.a);
    t.b = 3.14;
    printf("t.a: %d\n", t.a); // 输出可能不符合预期

    return 0;
}

共用体是 C 语言中一种强大的工具,合理使用可以节省内存并实现灵活的数据存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值