C 语言结构体数组

2025年8月2日 | 阅读 8 分钟

在 C 语言编程中,结构体数组可以定义为多个结构体变量的集合,其中每个变量都包含有关不同实体的信息。结构体数组主要用于在一个结构化数组中存储关于不同数据类型实体的数据。它也被称为结构体的集合。

简单的结构体数组示例

让我们看一个存储 5 名学生信息的结构体数组示例并打印出来。

示例

编译并运行

输出

Enter Records of 5 students
Enter Rollno: 1
Enter Name: John
Enter Rollno: 2
Enter Name: Michael
Enter Rollno: 3
Enter Name: Ronaldo
Enter Rollno: 4
Enter Name: Anthony 
Enter Rollno: 5
Enter Name: Mathew

Student Information List: 
Rollno: 1, Name: John
Rollno: 2, Name: Michael
Rollno: 3, Name: Ronaldo
Rollno: 4, Name: Anthony
Rollno: 5, Name: Mathew

说明

在此示例中,我们定义了一个包含两个成员(rollno 和 name)的 student 结构体。它使用循环收集并存储 5 名学生的学号和姓名,然后以结构化格式显示录入的学生记录。输入使用 scanf() 获取,数据使用 printf() 显示。

结构体数组声明

定义结构体后,结构体数组的声明就像声明任何其他变量一样。

struct 结构体名称 数组名称 [大小]

在此声明中,

  • 结构体名称:代表必须先定义的结构体类型名称。
  • 数组名称:代表将保存多个结构体变量的数组名称。
  • [大小]:代表数组可以容纳的元素数量。

结构体数组上的基本操作

在 C 语言中,对结构体数组有几种基本操作。其中一些如下:

结构体数组初始化

C 语言中,我们可以使用初始化列表初始化结构体和数组。因此,我们可以使用嵌套初始化列表来初始化结构体数组。

语法

它具有以下语法:

C 语言结构体数组初始化示例

让我们举例说明如何初始化结构体数组。

示例

编译并运行

输出

Points1:
(1.2, 2.6)
(3.3, 4.6)

Points2:
(5.8, 6.4)
(7.2, 8.9)

Points3:
(9.3, 10.9)
(11.3, 12.4)

说明

在此示例中,我们有一个 Point 结构体,它有两个 float 类型的成员:x 和 y。之后,它声明了结构体数组(points1、points2、points3)并使用不同的方法初始化它们:使用嵌套大括号、扁平(非嵌套)值和指定初始化器。最后,它通过循环打印所有三个数组中的坐标。输出显示每个数组中所有点的 (x, y) 值。

访问和更新成员

如果要访问数组中结构体的元素,我们必须使用数组索引后跟点 (.) 运算符。

语法

它具有以下语法:

在这个语法中,

  • 数组名称:代表结构体数组的名称。
  • ind:代表数组中结构体元素的索引。
  • mem_name:代表我们想要访问的结构体成员。

访问和更新成员示例

让我们举例说明如何在 C 语言中访问和更新成员。

示例

编译并运行

输出

After Update:
Model: Honda, Year: 2020
Model: Toyota, Year: 2022

说明

在此示例中,我们定义了一个 Car 结构体,其中包含一个 string 类型的 model 和一个 int 类型的 year。它使用两个记录初始化了一个汽车数组。之后,它通过数组索引(cars[0].year、cars[1].year)直接访问并修改了这两辆车的年份值。最后,for 循环遍历并打印每辆车的修改后的型号和年份。

结构体数组的遍历

在 C 语言中,结构化数组可以轻松遍历。它允许我们按特定顺序遍历数组结构中的每个元素。在 C 语言数组遍历中,我们使用循环来访问数组的每个元素。

C 语言结构体数组遍历示例

让我们举例说明如何在 C 语言中遍历结构体数组。

示例

编译并运行

输出

Employee Details:
ID: 1
Name: John
Salary: 50000.00

ID: 2
Name: Michael
Salary: 55000.00

ID: 3
Name: Anthony
Salary: 60000.00

说明

在此示例中,我们声明了一个 Employee 结构体来保存员工的 ID、姓名和工资。它声明了一个包含三个员工记录并带有初始值的 emp 数组。在 main() 函数中,它使用 for 循环遍历数组的每个元素,并使用 printf() 函数打印每个员工的 ID、姓名和工资。

查找结构体数组的大小

在 C 语言编程中,可以使用结构体的大小或数组中的元素数量来查找结构体数组的大小。

C 语言查找结构体数组大小的示例

让我们举例说明如何查找结构体数组的大小。

示例

编译并运行

输出

Total students: 4

说明

在此示例中,我们声明了一个 Student 结构体并创建了一个包含四个学生记录的数组。它使用 sizeof(students) 查找数组的总大小,并使用 sizeof(struct Student) 查找单个结构体的大小。学生数量通过将总大小除以单个元素的大小获得,然后打印结果。

声明指向结构体数组的指针

在 C 语言编程中,我们也可以定义一个指向结构体数组的指针。C 使用间接运算符() 来引用结构体变量的内部元素。

C 语言声明指向结构体数组的指针的示例

让我们举例说明如何在 C 语言中声明指向结构体数组的指针。

示例

编译并运行

输出

ID: 1, Name: James
ID: 2, Name: Harry
ID: 3, Name: Thomas

说明

在此示例中,我们有一个 Student 结构体,并创建了一个包含三个 'Student' 对象的数组。之后,我们使用指向数组基地址的指针,通过使用箭头 (->) 运算符执行指针算术来访问和打印每个学生的 ID 和姓名。

结构体数组的优点

在 C 语言中,结构体数组有几个优点。其中一些如下:

  • 高效的数据组织:它有助于将相关属性收集到一个结构体中,并将它们轻松地组织成一组相似的记录。
  • 访问方便:它提供对单个记录的索引访问,从而可以轻松地检索和操作数据。
  • 可伸缩性:它允许通过一个可管理的数组来处理大量数据,例如数千条记录。
  • 灵活性:它允许创建同类记录集合,从而方便进行排序或搜索等操作。
  • 代码可读性:通过逻辑化数据组织,消除混乱,从而提高程序结构和可维护性。

结构体数组的需求

在大多数实际应用中,应用程序倾向于处理一组相关但独立的记录,例如员工信息、学生成绩或产品目录。结构体数组通过提供以下功能来满足此目的:

  • 统一表示:它确保所有记录具有相同的属性和结构。
  • 简化的数据管理:它通过将多个单条记录组合成一个单一的结构化实体来促进大数据管理。
  • 逻辑分组:为每条记录整合属性,与处理每个属性的不同数组相比,可以减少冗余和错误。
  • 实际应用:它主要适用于构建数据库、应用操作结构化数据的算法或构建用户定义的数据类型等应用程序。

结论

总之,C 语言的结构体数组提供了一种强大而结构化的方法来管理一组相关的数据项,例如学生、员工或产品。由于它们同时提供了数组和结构体的优点,结构体数组使程序员能够高效地存储、检索、操作和处理同一类型多个实例的数据。

它们能够实现更高的代码可读性、可伸缩性和可维护性,尤其是在批量处理结构化记录的应用程序中。理解结构体数组对于编写简洁、健壮且能有效处理实际数据的 C 语言程序至关重要。

C 结构体数组常见问题解答

1) C 语言中的结构体数组是什么?

结构体数组是一组结构体变量,其中每个成员包含相同类型的信息,但代表不同的实体,例如不同的学生、汽车或电影。

2) 为什么我们需要使用结构体数组而不是不同的结构体变量?

在 C 语言中,对于每个结构体(例如 s1、s2、s3、...)包含不同的变量,对于大型数据集来说,这变得效率低下且难以管理。结构体数组提供了更优雅、更可伸缩的解决方案。

3) 可以在 C 语言中声明结构体数组时对其进行初始化吗?

可以。可以使用嵌套初始化列表或指定初始化器。

例如

4) 如何访问或更改数组中的结构体成员?

如果要更改或访问结构体成员,可以在 C 语言中使用索引和点运算符。

5) 我们可以在 C 语言中使用指针与结构体数组一起使用吗?

可以,将指针分配给数组的基地址,并使用 -> 运算符执行指针算术来访问成员。