首页 > 编程笔记 > C语言笔记

C语言结构体数组的定义和使用

C语言中的结构体数组将结构体和数组的概念结合在一起,使我们能够创建和管理多个相同类型的结构体。

结构体数组的定义

在C语言中,定义结构体数组的语法与定义普通数组类似,只不过数组的元素类型是结构体。以下是定义结构体数组的基本格式:

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

让我们通过一个具体的例子来说明结构体数组的定义。假设我们要创建一个存储学生信息的结构体数组:

#include <stdio.h>
#include <string.h>

#define MAX_STUDENTS 3

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

int main() {
    struct Student students[MAX_STUDENTS];
    
    // 后续代码将在这里继续...
    
    return 0;
}

在上面的代码中,我们定义了一个名为 Student 的结构体,包含姓名、年龄和平均成绩三个成员。然后,我们创建了一个名为 students 的结构体数组,可以存储最多 3 个学生的信息。

结构体数组的初始化

结构体数组可以在定义时进行初始化,也可以在后续的代码中逐个赋值。

定义时初始化

struct Student students[MAX_STUDENTS] = {
    {"Alice", 20, 3.8},
    {"Bob", 22, 3.5},
    {"Charlie", 21, 3.9}
};

逐个赋值

// 继续上面的 main 函数
strcpy(students[0].name, "Alice");
students[0].age = 20;
students[0].gpa = 3.8;

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

strcpy(students[2].name, "Charlie");
students[2].age = 21;
students[2].gpa = 3.9;

注意,当给字符数组成员赋值时,我们使用 strcpy 函数而不是直接赋值,这是因为字符数组不能直接用等号赋值。

访问结构体数组元素

访问结构体数组的元素与访问普通数组类似,只需使用数组索引即可。要访问结构体成员,我们使用点运算符.。以下是一个遍历并打印结构体数组的例子:

for (int i = 0; i < MAX_STUDENTS; i++) {
    printf("Student %d:\n", i + 1);
    printf("Name: %s\n", students[i].name);
    printf("Age: %d\n", students[i].age);
    printf("GPA: %.2f\n\n", students[i].gpa);
}

结构体数组作为函数参数

结构体数组可以作为函数参数传递,这使得我们能够在不同的函数中处理结构体数组。通常,我们会传递数组的首地址和数组的大小。下面是一个示例函数,用于计算所有学生的平均 GPA:

float calculateAverageGPA(struct Student *students, int size) {
    float totalGPA = 0;
    for (int i = 0; i < size; i++) {
        totalGPA += students[i].gpa;
    }
    return totalGPA / size;
}

// 在 main 函数中调用
float avgGPA = calculateAverageGPA(students, MAX_STUDENTS);
printf("Average GPA: %.2f\n", avgGPA);

完整示例

让我们把所有的概念整合在一起,创建一个完整的程序示例:

#include <stdio.h>
#include <string.h>

#define MAX_STUDENTS 3

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

float calculateAverageGPA(struct Student *students, int size) {
    float totalGPA = 0;
    for (int i = 0; i < size; i++) {
        totalGPA += students[i].gpa;
    }
    return totalGPA / size;
}

int main() {
    struct Student students[MAX_STUDENTS];
    
    // 初始化学生信息
    strcpy(students[0].name, "Alice");
    students[0].age = 20;
    students[0].gpa = 3.8;

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

    strcpy(students[2].name, "Charlie");
    students[2].age = 21;
    students[2].gpa = 3.9;

    // 打印学生信息
    for (int i = 0; i < MAX_STUDENTS; i++) {
        printf("Student %d:\n", i + 1);
        printf("Name: %s\n", students[i].name);
        printf("Age: %d\n", students[i].age);
        printf("GPA: %.2f\n\n", students[i].gpa);
    }

    // 计算并打印平均 GPA
    float avgGPA = calculateAverageGPA(students, MAX_STUDENTS);
    printf("Average GPA: %.2f\n", avgGPA);

    return 0;
}

这个程序展示了结构体数组的定义、初始化、访问和作为函数参数传递的全过程。运行这个程序,你将看到每个学生的信息以及所有学生的平均 GPA,如下所示:

Student 1:
Name: Alice
Age: 20
GPA: 3.80

Student 2:
Name: Bob
Age: 22
GPA: 3.50

Student 3:
Name: Charlie
Age: 21
GPA: 3.90

Average GPA: 3.73

声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。