Jim*_*hse 2 c pointers scanf pass-by-reference ampersand
问题是:
EdX 上的基本 C 编程 MOOC 展示了如何在通过指针传递结构时访问函数内结构的成员。他们到底为什么在&旁边使用*???
他们展示: scanf("%lf", &(*studptr).aveGrade);
为什么不只studptr.aveGrade在 scanf 中使用?
(撇开单独的问题,“为什么要使用 scanf”)
(被要求提供完整的例子)
void readStudent(struct student *studptr) {
print("\nEnter a new student record: \n");
printf("First name: ");
scanf("%s", (*studptr).firstName);
printf("Last name: ");
scanf("%s", (*studptr).lastName);
printf("Birth year: ");
scanf("%d", &(*studptr).birthYear);
printf("Average grade: ");
scanf("%lf", &(*studptr).aveGrade);
}
Run Code Online (Sandbox Code Playgroud)
在片段中:
scanf("%lf", &(*studptr).aveGrade);
Run Code Online (Sandbox Code Playgroud)
该&运营商应用好像有括号:
scanf("%lf", &((*studptr).aveGrade));
Run Code Online (Sandbox Code Playgroud)
没有充分的理由(*ptr).member优先使用ptr->member; 实际上,显式间接表示法更加冗长,当存在操作链时更是如此:
(*(*(*ptr).ptrmember).altptr).member
Run Code Online (Sandbox Code Playgroud)
对比:
ptr->ptrmember->altptr->member
Run Code Online (Sandbox Code Playgroud)
所以,代码应该是:
scanf("%lf", &studptr->aveGrade);
Run Code Online (Sandbox Code Playgroud)
是的,两者是“等价的”,但箭头符号是惯用的 C,而另一个则不是。