无法在c中取消引用双指针

时间:2018-04-17 03:10:23

标签: c dereference double-pointer

此代码的输出为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;
}

4 个答案:

答案 0 :(得分:2)

  

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

change1所做的事情存在误解。

它会更改p指向的位置,但该更改是函数的本地更改。它不会改变ptr指向main的位置,因为指针是按值传递的。 change1没有任何访问变量b的代码。我不清楚你认为它是什么。

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

答案 1 :(得分:1)

在change1中,p是一个指向int的指针,它由value传递。因此,在change1中为p赋值不起作用,因为p是change1的本地值。这就是第二次20的原因。

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

答案 2 :(得分:0)

void change1(int *p)
{
    p = &a;
}

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

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

但是,这是在函数中对指针变量进行更改的正确方法之一,以便它在外部仍然有效。 pp充当指向原始ptr变量的指针。结果,在更改2终止后,ptr将最终指向b(= 10)。这就是你的第三个10后面的原因。

答案 3 :(得分:0)

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

在幕后,您在堆栈上写了0xcafebabe值,change1() function只会在与此函数对应的堆栈帧上用&a覆盖此值。

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