在 C 语言中,结构体和联合体是重要的复杂数据类型,能够帮助我们以更加有组织的方式管理数据。本篇将深入探讨它们的定义、用途及区别,并结合实际案例,使读者能够更好地理解这些概念。
1. 结构体
1.1 结构体的定义与使用
结构体
是一种聚合数据类型,它可以将不同类型的数据组合成一个单一的实体。定义结构体的基本语法如下:
1 2 3 4 5
| struct 结构体名 { 数据类型 成员名1; 数据类型 成员名2; ... };
|
1.1.1 示例
定义一个 学生
结构体来存储学生的基本信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #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 结构体数组
结构体数组允许我们处理相同类型的多个结构体实例。例如,可以创建一个学生数组以存储多个学生的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #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 联合体的定义与使用
联合体
是一种特殊的数据类型,可以在同一个位置存储不同类型的数据。与结构体不同,联合体的所有成员共享同一段内存,因此在同一时刻只能存储一个成员的值。这可以通过节省内存空间的方式提供更多灵活性,其基本语法如下:
1 2 3 4 5
| union 联合体名 { 数据类型 成员名1; 数据类型 成员名2; ... };
|
2.1.1 示例
定义一个 数据
联合体来存储不同类型的数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #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);
strcpy(data.str, "Hello"); printf("data.str: %s\n", data.str);
return 0; }
|
在此示例中,Data
联合体可以存储一个整数、一个浮点数或一个字符串,但始终只会保留其中一个值。设置新值时,之前存储的值会被覆盖。
2.2 联合体的大小
可以使用 sizeof
运算符来检查联合体的大小。联合体的大小为其最大成员的大小:
1
| printf("Size of union Data: %zu\n", sizeof(data));
|
3. 结构体与联合体的比较
特性 |
结构体 |
联合体 |
内存分配 |
为所有成员分配内存 |
共享同一段内存,大小为最大成员尺寸 |
存储数据的方式 |
可以同时存储所有成员的值 |
只能存储一个成员的值 |
使用场景 |
合同信息、学生记录等 |
多种数据类型的临时存储(如网络数据) |
结论
通过理解 结构体
和 联合体
,可以在 C 语言编程中有效地管理和组织复杂数据。结构体
适合需要同时存储多项数据的场景,而 联合体
则在节省内存和灵活性方面提供了独特的优势。
下一篇我们将讨论 枚举
与 位域
的相关内容,进一步扩展 C 语言的高级特性。