授课语音

C语言中的结构体与联合体(structunion

在C语言中,struct(结构体)和 union(联合体)是两种重要的复合数据类型,它们用于将不同类型的数据组合在一起,方便数据的管理和操作。通过了解和使用它们,可以有效提高代码的可读性和功能扩展性。


1. 结构体(struct

1.1 定义与特点

  • struct 是一种复合数据类型,用于组合多个不同类型的数据。
  • 结构体中的每个成员都有独立的内存地址,可以单独访问。
  • 适用于需要管理和操作多种类型的相关数据的场景。

1.2 定义格式

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

1.3 代码案例:定义和使用结构体

#include <stdio.h>

// 定义一个表示学生信息的结构体
struct Student {
    char name[50];  // 学生姓名
    int age;        // 学生年龄
    float grade;    // 学生成绩
};

int main() {
    // 定义并初始化结构体变量
    struct Student student1 = {"张三", 20, 85.5};

    // 输出结构体成员
    printf("学生姓名: %s\n", student1.name);  // 输出姓名
    printf("学生年龄: %d\n", student1.age);   // 输出年龄
    printf("学生成绩: %.2f\n", student1.grade); // 输出成绩

    // 修改结构体成员
    student1.age = 21;
    printf("修改后的学生年龄: %d\n", student1.age); // 输出修改后的年龄

    return 0;
}

1.4 结构体的其他特性

  • 结构体数组:可以定义包含多个结构体对象的数组。
  • 结构体指针:通过指针操作结构体成员,提升代码的灵活性。

2. 联合体(union

2.1 定义与特点

  • union 是一种复合数据类型,所有成员共享同一段内存。
  • 任何时候,联合体中只能有一个成员存储有效值。
  • 适用于节省内存并需要在不同时间存储不同数据的场景。

2.2 定义格式

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

2.3 代码案例:定义和使用联合体

#include <stdio.h>

// 定义一个表示数值的联合体
union Data {
    int intVal;       // 整型数据
    float floatVal;   // 浮点型数据
    char charVal;     // 字符型数据
};

int main() {
    // 定义并初始化联合体变量
    union Data data;

    // 给整型成员赋值并输出
    data.intVal = 100;
    printf("整型值: %d\n", data.intVal);

    // 给浮点型成员赋值并输出(覆盖了之前的值)
    data.floatVal = 12.34;
    printf("浮点型值: %.2f\n", data.floatVal);

    // 给字符型成员赋值并输出(再次覆盖之前的值)
    data.charVal = 'A';
    printf("字符值: %c\n", data.charVal);

    // 注意:由于联合体成员共享内存,读取被覆盖的成员可能导致不可预测的结果
    printf("整型值(可能错误): %d\n", data.intVal);

    return 0;
}

2.4 联合体的其他特性

  • 节省内存:联合体占用的内存等于其最大成员的大小。
  • 灵活使用:可以根据需要在运行时选择存储类型。

3. 结构体与联合体的区别

特性 结构体(struct 联合体(union
内存分配 每个成员都有独立的内存空间 所有成员共享同一段内存
数据有效性 所有成员可以同时存储有效数据 任意时刻只有一个成员存储有效数据
使用场景 管理和操作多种类型的相关数据 节省内存并根据需求在运行时选择存储类型

4. 结合使用案例:结构体中嵌套联合体

#include <stdio.h>

// 定义一个表示设备状态的结构体,其中嵌套了联合体
struct Device {
    char name[50];      // 设备名称
    int type;           // 设备类型
    union {
        int intVal;     // 状态值(整型)
        float floatVal; // 状态值(浮点型)
    } status;           // 设备状态
};

int main() {
    // 定义并初始化结构体变量
    struct Device device1 = {"传感器", 1, .status.floatVal = 23.45};

    // 输出设备信息
    printf("设备名称: %s\n", device1.name);
    printf("设备类型: %d\n", device1.type);
    printf("设备状态值(浮点型): %.2f\n", device1.status.floatVal);

    // 修改设备状态值
    device1.status.intVal = 100;
    printf("设备状态值(整型): %d\n", device1.status.intVal);

    return 0;
}

通过以上内容,相信你对C语言中的结构体和联合体有了全面的理解。掌握它们的用法,有助于写出高效、清晰的代码。

去1:1私密咨询

系列课程: