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
相关产品推荐
相关产品推荐

