c语言 struct 和 union 详细介绍

在 C 语言中,struct 和 union 是两种重要的用户自定义数据类型,用于组织和管理复杂的数据。尽管它们有相似之处,但也有显著的区别。以下是对 struct 和 union 的详细介绍:

1. struct(结构体)

struct 是一种用户定义的数据类型,它允许将不同类型的数据组合在一起,形成一个更复杂的数据结构。

特性
  • 成员独立存储:每个成员都有独立的存储空间,彼此互不影响。
  • 顺序存储:成员按照定义的顺序存储在内存中。
  • 使用灵活:结构体可以包含不同类型的成员变量,适合描述复杂的对象或数据。
定义与使用
#include <stdio.h>

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

int main() {
    // 初始化结构体
    struct Person person1 = {"John", 25, 5.9};

    // 访问成员
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Height: %.2f\n", person1.height);

    return 0;
}
结构体的特点
  • 每个成员都有各自的存储空间,结构体的大小是所有成员的大小之和(加上可能的内存对齐)。
  • 可以使用点运算符 . 来访问结构体的成员。
  • 可以嵌套使用结构体(结构体中包含另一个结构体)。

2. union(共用体)

union 和 struct 类似,也是用于存储不同类型的数据。但与结构体不同的是,共用体中的所有成员共用一块内存,任何时候只能存储一个成员的值。

特性
  • 共享存储空间:所有成员共用同一块内存,大小等于成员中最大者。
  • 节省内存:由于共用体中所有成员共享内存,因此它的大小仅取决于最大成员的大小,适合需要节省空间的场合。
  • 成员互斥:一次只能保存一个成员的值,存储新值时会覆盖上一个成员的值。
定义与使用
#include <stdio.h>

// 定义共用体
union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;

    // 访问和修改成员
    data.i = 10;
    printf("Integer: %d\n", data.i);

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

    // 设置字符串后,之前的成员值会被覆盖
    strcpy(data.str, "C Programming");
    printf("String: %s\n", data.str);

    return 0;
}
共用体的特点
  • 共用体的所有成员共享同一块内存,存储新成员时会覆盖之前的值。
  • 可以使用点运算符 . 来访问共用体的成员。
  • 共用体适合在不同时间段使用不同成员的场景,减少内存开销。

3. struct 和 union 的区别

特性 结构体 struct 共用体 union
内存分配 每个成员都有独立的内存 所有成员共用一块内存
大小 结构体大小为所有成员大小之和 共用体大小等于最大成员的大小
成员访问 所有成员可以同时有效 每次只能存储一个成员,访问时其他成员被覆盖
用途 适合描述复杂的数据结构,所有成员可能同时有效 适合节省内存的场景,不同时间存储不同数据

4. 应用场景

  • struct 适合描述具有多个属性的对象或数据结构,所有属性可能同时有效。例如,描述一个人(姓名、年龄、身高)或描述一个二维坐标点(x 坐标和 y 坐标)。
  • union 适合节省内存的场景,通常在不同时间段使用不同类型的值。例如,定义一个变量在不同的时间可能是整数、浮点数或字符串,但不会同时存储多个值。

总结

  • struct 允许同时存储多个不同类型的成员,适用于复杂的数据结构。
  • union 通过共享内存节省空间,适用于需要节省内存的场景,但一次只能存储一个成员的值。

猜你喜欢

转载自blog.csdn.net/HJQD777/article/details/142644056