【问题标题】:Unable to dereference double pointer in c无法在c中取消引用双指针
【发布时间】:2018-04-17 03:10:23
【问题描述】:

这段代码的输出是20 20 10。前20很容易理解。但我无法理解函数 change1change2 是如何访问变量 b 的。

#include<stdio.h>
int a = 5, b = 10;
void change1(int *p);
void change2(int **pp);
main( )
{
    int x=20, *ptr=&x;
    printf("%d  ",*ptr);
    change1(ptr);
    printf("%d  ",*ptr);
    change2(&ptr);
    printf("%d\n",*ptr);
}
void change1(int *p)
{
    p = &a;
}
void change2(int **pp)
{
    *pp = &b;
}

【问题讨论】:

  • change2 函数正在访问b,因为您在其中使用了&amp;b。那是你打算写的吗?
  • void change1(int *p) { p = &amp;a; } 不影响ptr in change1(ptr);
  • 没有。对不起,如果我不清楚。我无法理解哪个指针正在访问哪个其他变量以及 b (10) 的最终值如何显示在输出中。

标签: c dereference double-pointer


【解决方案1】:

但我无法理解函数change1change2 是如何访问变量b

change1的作用存在误解。

它改变了p 指向的位置,但该改变是函数的局部变化。它不会改变ptrmain 中指向的位置,因为指针是按值传递的。 change1 没有任何代码可以访问变量 b。我不清楚你认为它是什么。

change2 中,您将指针指向的位置更改为b。更改会影响 ptrmain 中指向的位置,因为您将 ptr 的地址传递给 change2 并且您正在更改取消引用的指针指向的位置。

【讨论】:

    【解决方案2】:

    在 change1 中,p 是一个指向 int 的指针,它是按值传递的。因此,在 change1 中为 p 赋值没有任何效果,因为 p 是 change1 的本地。这就是第 2 次 20 的原因。

    在change2中,pp是一个指向int的指针。它也是按值传递的,但是这次取消引用 pp (*pp) 可以访问指针 (ptr) 的位置,并且 b (&b) 的地址存储在该位置中。

    【讨论】:

      【解决方案3】:
      void change1(int *p)
      {
          p = &a;
      }
      

      变量 p 被分配了 a 的地址,但这仅在函数内部有效。 p 在函数change1 中充当local variable。此函数终止后,指针 ptr 仍将指向 x(=20)。这就是第二个 20 背后的原因。

      void change2(int **pp)
      {
          *pp = &b;
      } 
      

      但是,这是在函数内更改指针变量以使其在外部仍然有效的正确方法之一。 pp 充当指向原始 ptr 变量的指针。因此,在更改 2 终止后,ptr 最终将指向 b(=10)。这就是你的第三个 10 背后的原因。

      【讨论】:

        【解决方案4】:

        当您调用 change1() 函数时,您将指针 ptr 作为参数传递。让我们假设 ptr = 0xcafebabe,显然是 *ptr = 20

        在底层,您将值 0xcafebabe 写入堆栈,而 change1() 函数只会用 &amp;a 覆盖该值在这个函数对应的栈帧上。

        在第二种情况下,您将一个指向 ptr 的指针作为参数传递。假设这个指针new_ptr 的值为0xdeadbeef
        在这种情况下,*new_ptr = 0xcafebabe 并且您用&amp;b 覆盖0xcafebabe(因此您正在更改指针的位置指向 em>。

        【讨论】:

          猜你喜欢
          • 2020-03-17
          • 1970-01-01
          • 1970-01-01
          • 2012-01-04
          • 2021-02-12
          • 2019-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多