无法取消对c中双指针的引用

无法取消对c中双指针的引用,c,dereference,double-pointer,C,Dereference,Double Pointer,此代码的输出为20 10。前20条很容易理解。但是我无法理解函数change1和change2是如何访问变量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);

此代码的输出为20 10。前20条很容易理解。但是我无法理解函数
change1
change2
是如何访问变量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;
}
#包括
INTA=5,b=10;
无效变更1(int*p);
无效变更2(整数**pp);
主要()
{
int x=20,*ptr=&x;
printf(“%d”,*ptr);
变更1(ptr);
printf(“%d”,*ptr);
变更2(&ptr);
printf(“%d\n”,*ptr);
}
无效更改1(int*p)
{
p=&a;
}
无效变更2(整数**pp)
{
*pp=&b;
}
但我无法理解函数
change1
change2
如何访问变量
b

change1
的作用存在误解

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

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

void change1(int *p)
{
    p = &a;
}
变量p被分配了a的地址,但这仅在函数中有效。p在函数
change1
中充当一个
局部变量。此函数终止后,指针ptr仍将指向x(=20)。这就是第二个20的原因

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

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

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


在引擎盖下,您正在堆栈上写入值
0xcafebabe
,而
change1()
函数只会在与此函数对应的堆栈框架上用
覆盖此值。


在第二种情况下,您将传递一个指向
ptr
的指针作为参数。假设此指针
new\u ptr
的值为
0xdeadbeef

在本例中,
*new\u ptr=0xcafebabe
并且您使用
覆盖
0xcafebabe
(因此,您正在更改指针指向的位置。

在change1中,p是指向int的指针,通过值传递。因此,在change1中为p赋值无效,因为p是change1的本地值。这就是第二个20的原因


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

由于您在其中使用了
&b
,所以
change2
函数正在访问
b
。这就是您要写的吗?
void change1(int*p){p=&a;}
不会影响
change1(ptr)中的
ptr
否。如果我不清楚,很抱歉。我无法理解哪个指针正在访问哪个其他变量,以及b(10)的最终值是如何在输出中显示的。