为什么以下代码的答案是1000?

时间:2018-03-28 12:34:16

标签: c pointers

我遇到了关于指针的问题,如下所示。我无法理解为什么以下代码的输出是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;
}

3 个答案:

答案 0 :(得分:5)

本声明:

px = &x;

x的地址指定给px。这句话:

ppx = &px;

px的地址指定给ppx。这句话:

f3(ppx);

ppx的值传递给f3。在f3中,此声明:

*pp = &y;

y的地址指定给pp指向的地方。 ppf3的参数,在调用中的值为ppx

也就是说,ppppx,其指向px。由于pp指向px*pp = &y会将y的地址放在px中。

现在px指向y。然后这句话:

printf("%d", *px);

打印px指向的内容,即y,即1000。

答案 1 :(得分:0)

此声明*pp = &y;导致打印1000。在致电f3() px之前,x的地址为px=&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标记编译代码,不要忽略警告。

答案 2 :(得分:0)

您可以通过引用间接通过指针来更改函数中的对象。

例如

#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

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

T *ppx = &px;

f( ppx, &x );

通过指向指针px的指针是直接的。在函数内,通过取消引用指向原始指针px的指针x,将指针pp与变量px的地址重新分配。