【发布时间】:2020-04-11 06:04:44
【问题描述】:
我查看了 this 和 this 和 this 和 this 等等。
问题是:
EdX 上的基本 C 编程 MOOC 展示了当结构通过指针传递时,如何访问函数内的结构成员。 为什么他们在*旁边使用&???
他们显示:scanf("%lf", &(*studptr).aveGrade);
为什么不在scanf中使用studptr.aveGrade?
(撇开单独的问题,“为什么要使用 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);
}
【问题讨论】:
-
是否有意,前两个
scanf()没有&? -
@RobertS-ReinstateMonica — 是的,输入是字符串,因此不需要
&。 (更准确地说,虽然不太简洁,成员firstname和lastname几乎可以肯定是char的数组,因此以书面形式传递它们传递了char *,这正是%s所期望的。添加&将传递一个char (*)[n],其中n是数组的大小——一种非常不同的类型。) -
@JonathanLeffler 非常感谢乔纳森。当您将
scanf()` 的输入分配给结构的成员时,我不知道这种情况。因此,当a是char的数组时,这种编码技术等效于scanf("%s",array);,而&是多余的,即使不是无效的,因为array已经指向数组的第一个元素,这是操作所必需的。 -
@RobertS-ReinstateMonica — 是的,情况基本相同。使用
&在技术上是不正确的(正如我所说),因为传入的指针类型不正确。在实践中,您通常会侥幸逃脱,但它正式是 UB(未定义的行为),应该不惜一切代价避免 UB(并且少输入一个字符是非常小的成本)。 -
它不是下一个,因为中间有一个括号。检查运算符优先级,您会发现
.的优先级高于&。
标签: c pointers scanf pass-by-reference ampersand