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

C 为什么下面代码的答案是1000?,c,pointers,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

我遇到一个关于指针的问题,如下所示。我无法理解为什么下面代码的输出是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 = &x;
ppx = &px;
f3(ppx);
*pp = &y;
printf("%d", *px);
将x的地址分配给px。本声明:

px = &x;
ppx = &px;
f3(ppx);
*pp = &y;
printf("%d", *px);
将px的地址分配给ppx。本声明:

px = &x;
ppx = &px;
f3(ppx);
*pp = &y;
printf("%d", *px);
将ppx的值传递给f3。在f3中,此语句:

px = &x;
ppx = &px;
f3(ppx);
*pp = &y;
printf("%d", *px);
将y的地址指定给pp指向的位置。pp是f3的参数,在调用中为其指定了值ppx

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

现在px指向y。那么这句话,

px = &x;
ppx = &px;
f3(ppx);
*pp = &y;
printf("%d", *px);
打印px指向的对象,即y,即1000。

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


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

可以在通过引用间接通过指针传递对象的函数中更改对象

比如说

#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;
}
#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;
}
在程序中,该函数处理指向main中声明的变量x的指针。这是指向变量x的指针。取消对指针的引用可以访问变量,从而可以更改它

*p = 20;
与更改具有指针类型的对象的方法相同。为此,必须通过引用传递对象/指针,如上所示

比如说

#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;
}
#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;
}
在程序开始时,由于typedef而具有int*类型的指针px被初始化为NULL。然后通过引用将其传递给函数f

T *ppx = &px;

f( ppx, &x );

这是通过指向指针px的指针间接实现的。在函数中,通过取消引用指向原始指针px的指针pp,用变量xb的地址重新分配指针px。

该函数正在将px的值从&x更改为&y,y的值为1000。这是无效的C。任何现代编译器都会对缺少的声明进行编译。同时,main必须是int mainvoidminimum@YatendraDubey代码是否编译?当您尝试将ppx传递到f3时,如果转发声明丢失,编译器是否会警告您?@vladfrommosco是的,代码是否编译