c - 为什么指针的值还是20?

标签 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);
}

为什么在函数退出时指针仍然是 20? 当 func() 结束时,我正在跳跃,指针在其中被修改,在最后一个 printf() 中, *p 值将从堆栈中指向一些随机的东西。

最佳答案

你有的是这个

void func(char *p)
{
    int q = 13;
    p = &q;
}

这意味着“使 p 指向 q”并更改 p 的值,它只是函数内部的一个变量。函数外不会反射(reflect)变量值的变化。

如果你要写这个

void func(char *p)
{
    int q = 13;
    *p = q;
}

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

如果你想在 main 中改变指针的值,你需要一个双指针:

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

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

关于c - 为什么指针的值还是20?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55354510/

相关文章:

c - 将 malloc 与静态指针一起使用

c - 如何将参数传递给函数指针

c - 字符串或不同语句代码中的隐藏或特殊字符

C 库的 C++ 包装器作为共享库

c++ - 这种情况是否需要删除或创建新变量?

c - 按值调用和按引用调用都有效吗?

c - 这个调用在 C 中是通过引用调用还是通过值调用?

c - _Atomic 类型限定符和类型说明符之间有区别吗?

c - 陷入无限循环 (C)

c - 二维数组和指针