通过引用传递值在c中第二次传递后不起作用

时间:2016-09-16 06:02:38

标签: c

   int main()
   {
      int *x = 100;

      display(&x);

   }

   display(int *m)
   {
      show(&m);
   }

   show(int *m)
   {
      printf("%d",*m)`; 
   }

输出应为100.但它没有显示

3 个答案:

答案 0 :(得分:4)

你搞乱了这些类型。 Se评论如下:

   int main()
   {
      int *x = 100;   // x is a "pointer to int" (with bad assignment)

      display(&x);    // Since you use &x you are passing a "pointer to a pointer to int"

   }

   display(int *m)    // but the function just expects a "pointer to int"
   {
      show(&m);       // Here you do the same
                      // m is a "pointer to int"
                      // so &m is a "pointer to pointer to int"
   }

   show(int *m)       // but the function just expects a "pointer to int"
   {
      printf("%d",*m)`; 
   }

要解决此问题,请执行以下操作:

   int main()
   {
      int x = 100;   // x is a "int"  (i.e. no *)

      display(&x);    // Passing a "pointer to int"

   }

   display(int *m)  
   {
      show(m);       // Just pass a "pointer to int" (i.e. no &) as 
                     // m is already "pointer to int"
   }

   show(int *m)
   {
      printf("%d",*m)`; 
   }

答案 1 :(得分:2)

  • int *x = 100;表示" x是一个引用地址100"处的内存单元的变量。在你的代码中手动分配指针地址几乎没有意义,因为......为什么你会这样做呢?如果您稍后在代码中尝试修改变量值,则很可能会遇到运行时错误。你最好只使x成为一个普通整数而不是一个指针。
  • &x是变量x的地址。使用int *x时,在调用display(&x)时,您会调用带有签名display(int** m)的函数。这不是您当前的display功能。如果您希望匹配类型,请拨打display(x)。如果您决定实际使x成为一个普通整数,那么您可以保持display(&x)调用。
  • 与上述相同,如果您想show(&m) mint*(正如您的display签名所指定的那样),那么您的show签名应该是show(int** m)。只需拨打show(m)即可。
  • 您的两个函数在签名中缺少返回类型。它可能会与一些编译器一起编译,但我不确定C规范是否允许这样做。
  • 如果您想将身体放在main功能之后,请确保您的两个功能是前向声明的。
  • 即便如此,函数调用中的类型不匹配也不应该编译。

好的尝试,但你应该更多地记录自己,有大量的基本指针使用的例子!

答案 2 :(得分:0)

在显示功能中,您已经有一个指针作为输入,您不需要再次获取该地址。您只需将指针传递到show函数。

display(int *m)
{
   show(m);
}