2 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
结构体,它包含 name
、age
和 gpa
三个成员。通过 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 语言的高级特性。