【问题标题】:Why is the pointer's value still 20?为什么指针的值还是 20?
【发布时间】:2019-08-16 16:20:09
【问题描述】:
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 值将指向堆栈中的一些随机内容。

【问题讨论】:

  • func 是无效的并且没有返回任何值。在 main 中的函数调用之后,每个值都是相同的。
  • 顺便说一句,您的问题标题与问题不匹配
  • 你好 Jabberwocky。下次我会努力注意的。写标题的时候没想到。感谢您的观察:)
  • 您将一个 int 指针传递给一个接受 char 指针的函数。请打开你的编译器警告!
  • 详细信息:*p 是 20。“指针的值”不是 20,而是类似于“0x1234000”`。

标签: c pointers call-by-value


【解决方案1】:

不,p 本身被传递为值。对func() 内部的p 所做的任何更改都不会反映回main()

为了完整起见,对p 指向的值(即*p)所做的任何更改都会反映在main() 中。

【讨论】:

    【解决方案2】:

    你拥有的是这个

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

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

    如果你要写这个

    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”,在这种情况下,您将有一个悬空指针,正如您在main 中所期望的那样。

    【讨论】:

    • void func(char **p) { int q = 13; *p = &q; ... 如果在调用 func() 后取消引用指针,则将调用未定义的行为。
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多