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

C语言结构体数组作为函数参数传递(2种方法)

在C语言中,结构体数组作为函数参数传递是一种常见且有用的编程方法,这种方法允许我们将多个相关数据组合在一起,并以数组的形式传递给函数。

定义结构体

我们首先需要定义一个结构体。假设我们要创建一个表示学生信息的结构体:

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

这个结构体包含了学生的姓名、年龄和平均成绩(GPA)。

创建结构体数组

接下来,我们可以创建一个包含多个学生信息的结构体数组:

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

将结构体数组作为函数参数传递

现在,让我们创建一个函数,该函数接受结构体数组作为参数。有两种主要方法可以实现这一点:

1) 使用数组语法

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

2) 使用指针语法

void printStudents(struct Student *students, int size) {
    for (int i = 0; i < size; i++) {
        printf("Name: %s, Age: %d, GPA: %.2f\n", 
               (students + i)->name, (students + i)->age, (students + i)->gpa);
    }
}

这两种方法在功能上是等价的。在C语言中,当数组作为参数传递时,实际上传递的是指向数组第一个元素的指针,因此,这两种语法都是有效的,选择哪种主要取决于个人偏好和代码可读性。

调用函数

在 main 函数中,我们可以这样调用上述函数:

int main() {
    struct Student students[3] = {
        {"Alice", 20, 3.8},
        {"Bob", 22, 3.5},
        {"Charlie", 21, 3.9}
    };
    
    int size = sizeof(students) / sizeof(students[0]);
    printStudents(students, size);
    
    return 0;
}

运行这段代码,我们将得到以下输出:

Name: Alice, Age: 20, GPA: 3.80
Name: Bob, Age: 22, GPA: 3.50
Name: Charlie, Age: 21, GPA: 3.90

总结

结构体数组在处理大量相似对象时特别有用,如学生记录、商品库存或任何需要批量处理的数据。在使用结构体数组作为函数参数时,有几点需要特别注意:

1) 数组大小

由于 C 语言不会自动传递数组的大小信息,我们需要额外传递一个表示数组大小的参数。这就是为什么在上面的例子中,我们同时传递了 students 数组和 size 参数。

2) 内存效率

传递结构体数组实际上是传递指针,而不是复制整个数组。这意味着传递大型结构体数组也是高效的,不会占用额外的内存。

3) 修改数组

在函数内部对结构体数组的修改会影响原始数组。如果你不希望修改原始数据,可以考虑使用 const 关键字:

void printStudents(const struct Student *students, int size) {
    // 函数体
}

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