第4课_结构体与联合
热度🔥:87 免费课程
授课语音
C语言中的结构体与联合体(struct
和 union
)
在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语言中的结构体和联合体有了全面的理解。掌握它们的用法,有助于写出高效、清晰的代码。