在这里尝试解决一个小概念问题。在这个示例中,它正在尝试通过引用将地址引用到以下函数的结构。
在我看来,我认为既然我通过了“&地址”,我就必须在函数中取消引用它来使用struct操作,例如
(*planet)->name;
,这使得他们在函数中使用“& planet”更加糟糕,这不会就像
&(&planet)
它只是让我觉得他们在结构的地址上使用结构运算符,而不是结构本身。
if (read_planet_ptr(&planet) != EOF) {
...
int read_planet_ptr(planet_t *planet) {
int nvals_read;
printf("Enter %s:\n", PLANETPROMPT);
nvals_read = scanf("%s %s %lf %lf %lf",
planet->name,
planet->orbits,
&planet->distance,
&planet->mass,
&planet->radius);
if (nvals_read != 5) {
return EOF;
} else {
return 0;
}
}
非常感谢任何帮助
答案 0 :(得分:2)
planet->name
操作相当于说(*planet).name
,因此应解决有关名称和轨道的混淆。
&planet->distance
以及其他使用解除引用运算符的人进入运算符优先级领域:
运算符->
的优先级高于&
,因此编译器会将其评估为:&(planet->distance)
,而不是(&planet)->distance
。虽然,如果这个例子首先包括括号,那将是很好的,以避免这种混淆:)。
我用于运算符优先级的源:http://en.cppreference.com/w/cpp/language/operator_precedence
答案 1 :(得分:2)
&planet->distance
实际上被评估为&(planet->distance)
,因此意味着获取结构成员的地址,scanf()
需要更新具有输入值的成员。
答案 2 :(得分:1)
我们可能会遇到以下情况,具体取决于" planet"是 -
案例1:如果您已声明" planet"作为你的结构的指针,即
planet_t *planet;
" read_planet_ptr"应该是这样的:
read_planet_ptr(planet_t ** planet)
因为: 当你将指针的地址传递给任何函数时,你需要一个双指针,即** 收到那个地址。然后你可以用以下方式取消引用: (*行星) - >信息
案例2: - 如果" planet"是" planet_t"类型的实例,那么函数read_planet_ptr应该可以正常工作。