想问大家一个关于结构体的问题:(*p).num此时这个p可以理解成行指针吗?也就是说p是指向这一整个结构体变量一整块。
就是书上这块,这样理解对嘛
如果这样理解没错的话,为什么下面这个代码,它上面 readrec(&st[k]) 那里应该是行指针,然后函数用了一个指向结构体的指针来接受,下面gets函数就直接用的是rec.name了是怎么回事,我想的是(*rec).name来能调用成员呀,另外name是个数组 那就是成员地址


想问大家一个关于结构体的问题:(*p).num此时这个p可以理解成行指针吗?也就是说p是指向这一整个结构体变量一整块。
就是书上这块,这样理解对嘛
如果这样理解没错的话,为什么下面这个代码,它上面 readrec(&st[k]) 那里应该是行指针,然后函数用了一个指向结构体的指针来接受,下面gets函数就直接用的是rec.name了是怎么回事,我想的是(*rec).name来能调用成员呀,另外name是个数组 那就是成员地址


以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
首先,关于结构体指针的问题,(*p).num 可以理解为 p 是一个指向结构体的指针,然后通过 *p 访问结构体的成员 num。所以 p 确实是一个指向结构体变量的指针。
至于你提到的代码问题,readrec 函数的参数应该是一个指向结构体的指针,所以在调用 readrec(&st[k]) 时,传入的是 st[k] 的地址,即指向结构体数组中的一个元素的指针。在 readrec 函数内部,可以直接使用 rec->name 来访问结构体的成员 name,因为 rec 是一个指向结构体的指针。同样地,rec->num、rec->s 和 rec->ave 也可以直接访问。
所以,你的理解是正确的,下面这段代码中,readrec 函数接受一个指向结构体的指针作为参数,然后在函数内部直接使用 rec->name 等成员访问方式。
#include <stdio.h>
struct stud
{
char num[5], name[10];
int s[4];
int ave;
};
int main()
{
struct stud st[30];
int i, k;
for (k = 0; k < 10; k++)
readrec(&st[k]);
writerec(st);
return 0;
}
readrec(struct stud *rec)
{
int i, sum;
char ch;
gets(rec->num);
gets(rec->name);
for (i = 0; i < 4; i++)
scanf("%d", &rec->s[i]);
ch = getchar(); // 跳过输入数据最后的回车符
sum = 0;
for (i = 0; i < 4; i++)
sum += rec->s[i];
rec->ave = sum / 4.0;
}