首页 > 编程笔记 > C语言笔记

C语言联合体的使用实例(5个)

联合体是C语言中一种特殊的数据类型,它允许在同一内存位置存储不同的数据类型。联合体的所有成员共享同一块内存,这意味着在任何给定时间只能使用一个成员。联合体的主要用途是节省内存空间和实现多态性。


让我们通过一些实际的例子来深入理解联合体的使用。

1. 基本联合体示例

以下是一个简单的联合体示例,展示了如何定义和使用联合体:

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

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

    return 0;
}

运行此代码,输出结果为:

data.i : 10
data.f : 220.5
data.str : C Programming

在这个例子中,我们定义了一个名为 Data 的联合体,它包含一个整数、一个浮点数和一个字符数组。我们可以看到,我们可以使用不同的成员来存储不同类型的数据。然而,需要注意的是,在任何给定时刻,只有最后赋值的成员是有效的。

2. 联合体的内存共享

联合体的一个重要特性是内存共享,让我们通过一个例子来说明这一点:

#include <stdio.h>

union SharedMemory {
    int i;
    char c[4];
};

int main() {
    union SharedMemory sm;

    sm.i = 0x12345678;

    printf("Integer: 0x%X\n", sm.i);
    printf("Characters: %02X %02X %02X %02X\n", 
           sm.c[0], sm.c[1], sm.c[2], sm.c[3]);

    return 0;
}

运行此代码,输出结果为(注意:结果可能因系统字节序而异):

Integer: 0x12345678
Characters: 78 56 34 12

在这个例子中,我们可以看到整数和字符数组共享同一块内存。当我们给整数赋值时,我们可以通过字符数组访问其各个字节。这种特性在处理底层数据结构时非常有用。

4. 使用联合体实现多态

联合体还可以用于实现一种简单的多态性,以下是一个示例:

#include <stdio.h>
#include <string.h>

enum DataType { INTEGER, FLOAT, STRING };

struct Item {
    enum DataType type;
    union {
        int i;
        float f;
        char str[20];
    } data;
};

void printItem(struct Item item) {
    switch(item.type) {
        case INTEGER:
            printf("Integer: %d\n", item.data.i);
            break;
        case FLOAT:
            printf("Float: %.2f\n", item.data.f);
            break;
        case STRING:
            printf("String: %s\n", item.data.str);
            break;
    }
}

int main() {
    struct Item item1 = {INTEGER, {.i = 42}};
    struct Item item2 = {FLOAT, {.f = 3.14}};
    struct Item item3 = {STRING, {.str = "Hello"}};

    printItem(item1);
    printItem(item2);
    printItem(item3);

    return 0;
}

运行此代码,输出结果为:

Integer: 42
Float: 3.14
String: Hello

在这个例子中,我们使用联合体和枚举类型创建了一个可以存储不同类型数据的结构。通过检查 type 字段,我们可以知道联合体中存储的是哪种类型的数据,从而正确地处理它。这种方法允许我们在同一个数据结构中处理不同类型的数据,实现了一种简单的多态性。

5. 联合体的实际应用

联合体在实际编程中有很多应用场景,例如,在网络编程中,我们经常需要处理不同字节序的数据:

#include <stdio.h>
#include <arpa/inet.h>

union IPAddress {
    uint32_t address;
    uint8_t bytes[4];
};

int main() {
    union IPAddress ip;
    
    ip.address = 0x01020304;  // 1.2.3.4 in network byte order
    
    printf("IP Address: %d.%d.%d.%d\n", 
           ip.bytes[0], ip.bytes[1], ip.bytes[2], ip.bytes[3]);
    
    ip.address = htonl(ip.address);  // Convert to host byte order
    
    printf("IP Address (host order): %d.%d.%d.%d\n", 
           ip.bytes[0], ip.bytes[1], ip.bytes[2], ip.bytes[3]);

    return 0;
}

运行此代码,输出结果为:

IP Address: 1.2.3.4
IP Address (host order): 4.3.2.1

在这个例子中,我们使用联合体来方便地在 IP 地址的整数表示和字节数组表示之间进行转换,这在网络编程中非常有用,因为网络协议通常使用大端字节序,而许多计算机系统使用小端字节序。


声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。