【问题标题】:Why the answer of following code is 1000? [closed]为什么下面代码的答案是 1000? [关闭]
【发布时间】:2018-03-28 12:34:16
【问题描述】:

我遇到了一个关于指针的问题,如下所示。我无法理解为什么下面代码的输出是 1000 而不是 10。谁能帮我怎么可能?

#include<stdio.h>
int y;
void main()
{
    int x, *px, **ppx;
    x = 10;
    y = 1000;
    px = &x;
    ppx = &px;
    f3(ppx);
    printf("%d", *px);
}
void f3(int **pp)
{
    *pp = &y;
}

【问题讨论】:

  • 函数将px的值从&amp;x更改为&amp;yy的值是1000
  • 这不是有效的 C。任何现代编译器都会遵守缺少的声明。另外main 必须至少是int main(void)
  • @Yatendra Dubey 代码编译了吗?
  • 当您尝试将ppx 传递给缺少前向声明的f3 时,编译器是否不会警告您?
  • @VladfromMoscow 是的,代码确实可以编译

标签: c pointers


【解决方案1】:

此声明:

px = &x;

x 的地址分配给px。本声明:

ppx = &px;

px 的地址分配给ppx。本声明:

f3(ppx);

ppx 的值传递给f3。在f3,这个声明:

*pp = &y;

y 的地址分配给pp 指向的位置。 ppf3 的参数,在调用中被赋值为ppx

ppppx,它指向px。由于pp指向px,所以*pp = &amp;yy的地址放入px中。

现在px 指向y。那么这个语句:

printf("%d", *px);

打印px指向的东西,也就是y,也就是1000。

【讨论】:

    【解决方案2】:

    这条语句*pp = &amp;y; 导致打印1000。在调用f3()之前px指向x的地址为px=&amp;x;,但在f3()px被修改为y的地址。

    int y;
    void f3(int **pp){ /*since you didn't declare functin,
                       so either declare it or define before main() */
            *pp = &y;/* px contains now address of y */
    }
    int main(){ /* use int main() instead of void main() */
            int x,*px,**ppx;
            x=10;
            y=1000;
            px=&x;/* px points to address of x*/
            ppx=&px; /* ppx points to address of px */
            f3(ppx); /* passing ppx i.e address of px 
                     And in f3() *pp = &y means px got replaced by 
                     address of y */
            printf("%d",*px); /* prints value at address of y, not address of x */
            return 0;
    }
    

    始终使用-Wall 标志编译您的代码,不要忽略警告。

    【讨论】:

      【解决方案3】:

      您可以更改函数中的对象,该函数通过引用间接通过指针传递它。

      例如

      #include <stdio.h>
      
      void f( int *p, int value )
      {
          *p = value;
      }
      
      int main(void) 
      {
          int x = 10;
      
          printf( "Before call f x = %d\n", x );
      
          int *px = &x;
      
          f( px, 20 );
      
          printf( "After call f x = %d\n", x );
      
          return 0;
      }
      

      程序输出是

      Before call f x = 10
      After call f x = 20
      

      在程序中,函数处理指向在 main 中声明的变量 x 的指针。那就是指向变量x的指针。取消引用您可以访问变量的指针,从而可以更改它。

      *p = 20;
      

      您可以通过相同的方式更改具有指针类型的对象。为此,您必须通过引用传递对象/指针,如上所示。

      例如

      #include <stdio.h>
      
      typedef int * T;
      
      void f( T *pp, T p )
      {
          *pp = p;
      }
      
      int main(void) 
      {
          int x = 10;
      
          T px = NULL;
      
          T *ppx = &px;
      
          f( ppx, &x );
      
          printf( "After call f *px = %d\n", *px );
      
          return 0;
      }
      

      程序输出是

      After call f *px = 10
      

      在程序开始时,类型为int *(由于typedef)的指针pxNULL初始化。然后通过引用传递给函数f

      T *ppx = &px;
      
      f( ppx, &x );
      

      即间接通过指向指针px 的指针。在函数中,指针px 被重新分配变量x 的地址,方法是取消引用指向原始指针px 的指针pp

      【讨论】:

        猜你喜欢
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多