C - 将struct地址作为函数参数传递

时间:2014-07-23 22:47:32

标签: c struct

在这里尝试解决一个小概念问题。在这个示例中,它正在尝试通过引用将地址引用到以下函数的结构。

在我看来,我认为既然我通过了“&地址”,我就必须在函数中取消引用它来使用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;
  }
}

非常感谢任何帮助

3 个答案:

答案 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应该可以正常工作。