Jupyter AI

2 C语言高级特性之结构体与联合体

📅 发表日期: 2024年8月10日

分类: 💻C++ 高级

👁️阅读: --

在 C 语言中,结构体和联合体是重要的复杂数据类型,能够帮助我们以更加有组织的方式管理数据。本篇将深入探讨它们的定义、用途及区别,并结合实际案例,使读者能够更好地理解这些概念。

1. 结构体

1.1 结构体的定义与使用

结构体 是一种聚合数据类型,它可以将不同类型的数据组合成一个单一的实体。定义结构体的基本语法如下:

struct 结构体名 {
    数据类型 成员名1;
    数据类型 成员名2;
    ...
};

1.1.1 示例

定义一个 学生 结构体来存储学生的基本信息:

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

struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    struct Student student1;

    // 填充学生信息
    strcpy(student1.name, "Alice");
    student1.age = 20;
    student1.gpa = 3.75;

    // 输出学生信息
    printf("Name: %s\n", student1.name);
    printf("Age: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

在上面的例子中,我们定义了一个 Student 结构体,它包含 nameagegpa 三个成员。通过 student1 实例,我们可以轻松访问和修改这些信息。

1.2 结构体数组

结构体数组允许我们处理相同类型的多个结构体实例。例如,可以创建一个学生数组以存储多个学生的信息:

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

struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    struct Student students[3];

    // 填充学生信息
    strcpy(students[0].name, "Alice");
    students[0].age = 20;
    students[0].gpa = 3.75;

    strcpy(students[1].name, "Bob");
    students[1].age = 22;
    students[1].gpa = 3.85;

    strcpy(students[2].name, "Charlie");
    students[2].age = 21;
    students[2].gpa = 3.90;

    // 输出所有学生信息
    for (int i = 0; i < 3; i++) {
        printf("Name: %s, Age: %d, GPA: %.2f\n", students[i].name, students[i].age, students[i].gpa);
    }

    return 0;
}

在此示例中,通过 students 数组存储了三名学生的信息。使用循环,我们可以方便地输出所有学生的数据。

2. 联합体

2.1 联合体的定义与使用

联合体 是一种特殊的数据类型,可以在同一个位置存储不同类型的数据。与结构体不同,联合体的所有成员共享同一段内存,因此在同一时刻只能存储一个成员的值。这可以通过节省内存空间的方式提供更多灵活性,其基本语法如下:

union 联合体名 {
    数据类型 成员名1;
    数据类型 成员名2;
    ...
};

2.1.1 示例

定义一个 数据 联合体来存储不同类型的数据:

#include <stdio.h>

union Data {
    int intVal;
    float floatVal;
    char str[20];
};

int main() {
    union Data data;

    // 将整数存入联合体
    data.intVal = 10;
    printf("data.intVal: %d\n", data.intVal);

    // 将浮点数存入联合体
    data.floatVal = 220.5;
    printf("data.floatVal: %.2f\n", data.floatVal); // 注意:此时 intVal 的值可能不再有效

    // 将字符串存入联合体
    strcpy(data.str, "Hello");
    printf("data.str: %s\n", data.str); // 注意:此时 intVal 和 floatVal 的值可能不再有效

    return 0;
}

在此示例中,Data 联合体可以存储一个整数、一个浮点数或一个字符串,但始终只会保留其中一个值。设置新值时,之前存储的值会被覆盖。

2.2 联合体的大小

可以使用 sizeof 运算符来检查联合体的大小。联合体的大小为其最大成员的大小:

printf("Size of union Data: %zu\n", sizeof(data));

3. 结构体与联合体的比较

特性 结构体 联合体
内存分配 为所有成员分配内存 共享同一段内存,大小为最大成员尺寸
存储数据的方式 可以同时存储所有成员的值 只能存储一个成员的值
使用场景 合同信息、学生记录等 多种数据类型的临时存储(如网络数据)

结论

通过理解 结构体联合体,可以在 C 语言编程中有效地管理和组织复杂数据。结构体 适合需要同时存储多项数据的场景,而 联合体 则在节省内存和灵活性方面提供了独特的优势。

下一篇我们将讨论 枚举位域 的相关内容,进一步扩展 C 语言的高级特性。