跳到主要内容

C 语言复杂数据结构

在C语言中,结构体(struct)和联合(union)是两种非常重要的复杂数据结构。它们允许你将不同类型的数据组合在一起,从而更灵活地组织和操作数据。本文将详细介绍这两种数据结构的概念、用法以及实际应用场景。

1. 结构体(Struct)

1.1 什么是结构体?

结构体是一种用户定义的数据类型,它允许你将多个不同类型的变量组合在一起。结构体中的每个变量称为成员(member),它们可以是任何数据类型,包括基本类型、数组、指针,甚至是其他结构体。

1.2 定义结构体

定义一个结构体的语法如下:

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

例如,定义一个表示学生的结构体:

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

1.3 使用结构体

定义结构体后,你可以声明结构体变量并访问其成员:

c
#include <stdio.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.8;

printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("GPA: %.2f\n", student1.gpa);

return 0;
}

输出:

Name: Alice
Age: 20
GPA: 3.80

1.4 结构体指针

你可以使用指针来访问结构体成员,语法如下:

c
struct Student *ptr = &student1;
printf("Name: %s\n", ptr->name);

1.5 结构体数组

结构体也可以用于定义数组,例如:

c
struct Student students[3];
students[0].age = 19;

2. 联合(Union)

2.1 什么是联合?

联合是一种特殊的数据类型,它允许你在同一内存位置存储不同的数据类型。联合的所有成员共享同一块内存空间,因此联合的大小等于其最大成员的大小。

2.2 定义联合

定义一个联合的语法如下:

c
union 联合名 {
数据类型 成员1;
数据类型 成员2;
// 更多成员...
};

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

c
union Data {
int i;
float f;
char str[20];
};

2.3 使用联合

联合的使用方式与结构体类似,但需要注意的是,联合的所有成员共享同一块内存空间:

c
#include <stdio.h>

union Data {
int i;
float f;
char str[20];
};

int main() {
union Data data;
data.i = 10;
printf("data.i: %d\n", data.i);

data.f = 220.5;
printf("data.f: %.2f\n", data.f);

strcpy(data.str, "C Programming");
printf("data.str: %s\n", data.str);

return 0;
}

输出:

data.i: 10
data.f: 220.50
data.str: C Programming
备注

注意:联合的所有成员共享同一块内存空间,因此修改一个成员的值会影响其他成员的值。

3. 实际应用场景

3.1 结构体的应用

结构体常用于表示复杂的数据实体,例如:

  • 学生信息:姓名、年龄、成绩等。
  • 员工信息:姓名、职位、工资等。
  • 图形对象:坐标、颜色、大小等。

3.2 联合的应用

联合常用于节省内存空间或处理不同类型的数据,例如:

  • 网络协议:处理不同类型的数据包。
  • 硬件寄存器:访问同一寄存器的不同部分。
  • 类型转换:在不同类型之间进行转换。

4. 总结

结构体和联合是C语言中非常重要的复杂数据结构。结构体允许你将不同类型的数据组合在一起,而联合则允许你在同一内存位置存储不同的数据类型。掌握这两种数据结构将帮助你更灵活地组织和操作数据。

5. 附加资源与练习

5.1 附加资源

5.2 练习

  1. 定义一个表示矩形的结构体,包含宽度和高度,并计算其面积。
  2. 定义一个联合,用于存储整数、浮点数和字符串,并尝试修改不同类型的成员,观察输出结果。
提示

提示:在练习中使用结构体和联合时,注意内存的使用和成员之间的关系。