You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体数组的成员访问及指针传参使用疑问

问题解答

核心结论

C语言本身没有引用语法,你所说的「传入数组的引用」本质是指针操作。结构体数组传参时不需要额外传递二级指针类的“数组引用”,直接传递数组名即可:数组名会自动隐式转换为指向首元素的指针,函数内部通过该指针操作的就是原数组的内存,可直接修改原数组内容。

你现有代码的问题

  • 参数类型不匹配:你定义的read和write函数参数是grades *s[],等价于二级指针grades **s,而main中v是grades[5]类型,&v的类型是grades (*)[5](指向长度为5的grades数组的指针),二者类型完全不兼容,运行会直接出错。
  • scanf传参错误:读取int和float类型的成员时需要传递地址,你代码里直接写s[i]->i、s[i]->f是值传递,会触发内存访问错误。

修正后的可运行代码

#include <stdio.h>
#define DIM 20 // 补充你原代码缺失的DIM宏定义

typedef struct grades{
    char s1[DIM];
    char s2[DIM];
    int i;
    float f;
}grades;

// 参数直接用grades数组类型,也可写成grades *s,二者在函数参数中完全等价
void read(grades s[]);
void write(grades g[]);

int main() {
    grades v[5];
    // 直接传数组名即可,不需要加&符号
    read(v);
    write(v);
    return 0;
}

void read (grades s[]){
    printf("enter the first name, last name, student number and score:\n");
    int i;
    for (i=0;i<5;i++){
        // int和float类型成员需要取地址传入scanf
        scanf("%s %s %d %f", s[i].s1, s[i].s2, &s[i].i, &s[i].f );
    }
}

void write(grades g[]){
    int i;
    for (i=0;i<5;i++){
        printf("%s %s %d %.2f\n", g[i].s1, g[i].s2, (g[i].i)+5, (g[i].f)+5 );
    }
}

补充说明

只有极少数特殊场景(比如需要修改动态分配数组的首地址)才需要传递二级指针,普通的数组读写场景直接传递数组名即可,不需要额外取数组地址传参。

内容的提问来源于stack exchange,提问作者sajjad eshghi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:48:01