在C语言中,structure(结构体)和union(联合体)是用于组织和存储不同类型数据的方式。它们有相似之处,但也有一些关键的区别。

Structure(结构体): 结构体是一种用户自定义的数据类型,可以将不同类型的变量组合在一起形成一个逻辑上相关的数据单元。结构体的成员可以是不同的数据类型,每个成员都有自己的名称和内存地址。结构体的各个成员在内存中是按照定义的顺序存储的,每个成员占据自己的内存空间。

下面是一个示例,展示如何定义和使用结构体:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

// 定义结构体
struct Person {
    char name[20];
    int age;
    float height;
};

int main() {
    // 创建结构体变量
    struct Person person1;

    // 访问结构体成员并赋值
    strcpy(person1.name, "John");
    person1.age = 25;
    person1.height = 1.75;

    // 输出结构体成员的值
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Height: %.2f\n", person1.height);

    return 0;
}

上述示例中,我们定义了一个名为 “Person” 的结构体,包含了名字、年龄和身高三个成员。在 main() 函数中,我们创建了一个名为 “person1” 的结构体变量,并通过成员访问操作符 . 分别对其成员进行赋值和访问。


Union(联合体): 联合体也是一种用户自定义的数据类型,它允许在同一内存位置存储不同类型的数据,但每次只能使用其中的一个成员。联合体的所有成员共享同一块内存,它的大小由最大的成员决定。

下面是一个示例,展示如何定义和使用联合体:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

// 定义联合体
union Data {
    int num;
    float f;
    char str[20];
};

int main() {
    // 创建联合体变量
    union Data data;

    // 对不同成员赋值
    data.num = 10;
    printf("Num: %d\n", data.num);

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

    strcpy(data.str, "Hello");
    printf("String: %s\n", data.str);

    return 0;
}

上述示例中,我们定义了一个名为 “Data” 的联合体,包含了整型、浮点型和字符型三个成员。在 main() 函数中,我们创建了一个名为 “data” 的联合体变量,并分别对不同成员进行赋值和访问。需要注意的是,联合体的不同成员共享同一块内存,所以在给一个成员赋值后,其他成员的值会被覆盖。


关键区别总结:

  • 结构体允许存储多个成员,每个成员都占据自己的内存空间。
  • 联合体只能同时存储一个成员,所有成员共享同一块内存空间。

结构体适合用于表示相关但不同类型的数据集合,而联合体适合用于节省内存,同时只需存储一种类型的数据,或者在不同类型数据之间进行转换。