为什么指针的值仍为20?

The*_* P. 2 c pointers call-by-value

void func(char *p)
{
    int q = 13;
    p = &q;
    printf("%d\n", *p);
}

void main(void)
{
    int var = 20;
    int *p = &var;

    printf("%d\n", *p);

    func(p);

    printf("%d\n", *p);
}
Run Code Online (Sandbox Code Playgroud)

为何函数退出时指针仍为20?我跳到func()结尾时,在其中修改了指针,最后printf(),该*p值指向堆栈中的一些随机内容。

Sam*_*nen 6

这是你的

void func(char *p)
{
    int q = 13;
    p = &q;
}
Run Code Online (Sandbox Code Playgroud)

这意味着“使p指向q”并更改的值p,这只是函数内部的一个变量。函数外部没有变量值的变化。

如果你要写这个

void func(char *p)
{
    int q = 13;
    *p = q;
}
Run Code Online (Sandbox Code Playgroud)

这意味着“将p指向其的变量将其值更改为13”,这将在外部看到,这意味着varmain中的变量将更改其值(取决于字节序,因为它是int而不是char作为指针声称是)。

如果要在main中更改指针的值,则需要一个双指针:

void func(char **p)
{
    int q = 13;
    *p = &q;
    printf("%d\n", *p);
}
Run Code Online (Sandbox Code Playgroud)

这意味着“使指向p局部变量的指针q”,在这种情况下,您将有一个悬空的指针main