此代码的输出为20 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;
}
答案 0 :(得分:2)
但我无法理解函数
change1
和change2
如何访问变量b
。
对change1
所做的事情存在误解。
它会更改p
指向的位置,但该更改是函数的本地更改。它不会改变ptr
指向main
的位置,因为指针是按值传递的。 change1
没有任何访问变量b
的代码。我不清楚你认为它是什么。
在change2
中,您正在将指针指向的位置更改为b
。此更改会影响ptr
在main
中指向的位置,因为您将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
(因此,您是更改指针指向的位置。