C - 结构体数组

你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索C编程世界的 Arrays of Structures(结构体数组)。如果你是编程新手,不用担心;我会用我在课堂上多年来使用的耐心和热情,一步步引导你。让我们跳进去吧!

C - Arrays of Structures

结构体和数组是什么?

在我们跳进结构体数组之前,让我们快速回顾一下结构体和数组各自是什么。

结构体

在C语言中,结构体就像一个容器,可以容纳不同类型的数据。想象一个背包,你可以存放各种物品 - 那就是你的结构体!例如:

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

在这里,我们的 Student 结构体可以包含一个名字、一个年龄和一个平均成绩点(GPA)。很酷吧?

数组

另一方面,数组是相同类型项的集合。把它想象成一排相同的储物柜,每个储物柜里存放着同一种物品。例如:

int numbers[5] = {1, 2, 3, 4, 5};

这个名为 numbers 的数组可以存放5个整数。

现在,如果我们结合这两个概念会发生什么?那就是魔法发生的地方!

结构体数组

结构体数组正如其名 - 一个数组的每个元素都是结构体。就像一个充满学生特性的教室。

让我们探讨如何使用这些强大的构造!

声明结构体数组

要声明一个结构体数组,我们首先定义我们的结构体,然后创建一个该结构体类型的数组。下面是如何操作的:

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

struct Student class[30];

在这个例子中,我们创建了一个名为 class 的数组,可以存放30个学生的信息。就像有30个学生卡片,每个包含一个名字、年龄和GPA。

初始化结构体数组

现在我们已经声明了数组,让我们用一些数据填充它。我们可以用两种方式来做:

  1. 在声明时初始化:
struct Student class[3] = {
{"Alice", 20, 3.8},
{"Bob", 22, 3.5},
{"Charlie", 21, 3.9}
};
  1. 在声明后初始化:
strcpy(class[0].name, "Alice");
class[0].age = 20;
class[0].gpa = 3.8;

strcpy(class[1].name, "Bob");
class[1].age = 22;
class[1].gpa = 3.5;

// ...以此类推

记住,在C语言中处理字符串时,我们使用 strcpy 来给字符数组赋值。

读取结构体数组

读取结构体数组很简单。我们可以使用数组索引和点符号来访问结构体成员:

printf("学生姓名: %s\n", class[0].name);
printf("学生年龄: %d\n", class[0].age);
printf("学生GPA: %.2f\n", class[0].gpa);

我们还可以使用循环来读取整个数组:

for (int i = 0; i < 3; i++) {
printf("学生 %d:\n", i+1);
printf("姓名: %s\n", class[i].name);
printf("年龄: %d\n", class[i].age);
printf("GPA: %.2f\n\n", class[i].gpa);
}

这段代码将打印出我们 class 数组中所有三个学生的信息。

对结构体数组排序

对结构体数组排序要复杂一些,但别担心 - 我们会一步步来。假设我们想按GPA降序排列学生:

#include <string.h>

void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}

void sortByGPA(struct Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].gpa < arr[j+1].gpa) {
swap(&arr[j], &arr[j+1]);
}
}
}
}

// 使用方法:
sortByGPA(class, 3);

这段代码使用冒泡排序算法来根据学生的GPA来排列。调用 sortByGPA 后,class 数组将按GPA最高到最低排序。

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

指针是C语言中的强大工具,我们也可以在结构体数组中使用它们。以下是如何声明指向结构体数组的指针:

struct Student *classPtr = class;

现在,classPtr 指向 class 数组的第一个元素。我们可以使用这个指针来访问元素:

printf("第一个学生的姓名: %s\n", classPtr->name);
printf("第二个学生的年龄: %d\n", (classPtr+1)->age);

注意,在处理指向结构的指针时,我们使用箭头操作符(->)。

结论

恭喜你!你在C编程旅程中迈出了巨大的一步。结构体数组在现实世界的编程场景中非常有用。想象一下管理学校数据库、组织图书馆目录或跟踪商店库存 - 有了结构体数组,这些任务都会变得容易得多。

记住,熟能生巧。尝试创建你自己的结构体数组,用数据填充它们,对它们进行排序,并用不同的方法操作数据。在你意识到之前,你将能够像专业人士一样构建你的代码!

快乐编码,愿你的数组总是正确索引!

Credits: Image by storyset