c函数传递结构体数组

结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。(结构体变量传递给函数与基本变量传递给函数类似,可参考c函数传值调用和引用调用

如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。(结构体数组传递给函数与数组传递给函数类似)

一 形式参数

形式参数是一个结构体指针

void average(struct stu *ps, int len)

{...}

二 调用方式

结构体数组名是一个指向结构体数组中第一个元素的常量指针,将结构体数组名(常量指针)传递给函数

average(stus, len);

三 案列展示

#include <stdio.h>
struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
}stus[] = {
    {"Li ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"He fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
};
void average(struct stu *ps, int len);
int main(){
    int len = sizeof(stus) / sizeof(struct stu);
    average(stus, len);
    return 0;
}
void average(struct stu *ps, int len){
    int i, num_140 = 0;
    float average, sum = 0;
    for(i=0; i<len; i++){
        sum += (ps + i) -> score;
        if((ps + i)->score < 140) num_140++;
    }
    printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
}

 

### 如何在C/C++中将结构体数组传递函数作为参数 #### 定义结构体并创建结构体数组 为了展示如何将结构体数组传递函数,先定义一个简单的结构体`Student`表示学生的信息。之后初始化一个由多个这种结构组成的数组。 ```c++ struct Student { int id; char name[50]; float scores[3]; // 假设有三门课程成绩 }; ``` 接着可以创建一个这样的结构体数组: ```c++ // 创建三个学生的记录 Student stuArray[] = { {1, "Zhang San", {89.5f, 78.0f, 92.0f}}, {2, "Li Si", {85.0f, 88.5f, 94.0f}}, {3, "Wang Wu", {76.5f, 82.0f, 88.5f}} }; ``` #### 函数声明与实现 当准备好了要处理的数据后,下一步就是编写接受这些数据的函数。这里以打印每位学生的平均分为例来说明如何接收结构体数组作为参数。 ##### 方法一:直接使用结构体数组名称作为参数 可以直接把整个数组的名字当作实际参数传入到形式参数里去。注意此时的形式参数应该是指向特定类型的指针或者是带有未知大小维度的数组。 ```c++ void printAverageScores(Student list[], int size) { for(int i=0; i<size; ++i){ printf("ID:%d Average Score:",list[i].id); float sum = 0; for(int j=0;j<3;++j) sum += list[i].scores[j]; printf("%.2f\n",sum/3); } } ``` 调用此函数时只需提供数组名以及其长度即可[^3]。 ##### 方法二:利用指向结构体的指针 另一种方式是让形参成为指向单个元素(即结构体实例)的指针,并且通常会额外加上传递数组的实际尺寸以便遍历操作。 ```c++ void printAveragesWithPointer(Student *ptr, int count) { while(count--){ printf("ID:%d Average Score:", ptr->id); float avgScore = (ptr->scores[0]+ptr->scores[1]+ptr->scores[2])/3; printf("%.2f\n",avgScore); ++ptr; } } ``` 这种方式下,可以通过解引用运算符访问各个字段的内容,同时也可以通过增加指针位置的方式来迭代访问下一个对象。 ##### 调用上述任一函数的方法如下所示: ```c++ int main(){ ... // 使用任意一种方法都可以正常工作 printAverageScores(stuArray,sizeof(stuArray)/sizeof(stuArray[0])); OR printAveragesWithPointer(stuArray,sizeof(stuArray)/sizeof(stuArray[0])); return 0; } ``` 以上就是在C/C++程序设计中关于怎样将结构体数组作为参数传递给其他子过程的具体做法[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值