请看下面的代码:
#include <stdio.h>
void main()
{
int a=30;
int *var=&a;
Change(&var);
printf("%d %d",*var,a);
}
int Change(int**ptr)
{
**ptr=40;
}
#include <stdio.h>
void main()
{
int a=30;
int *var=&a;
Change(var);
printf("%d %d",*var,a);
}
int Change( int *ptr)
{
*ptr=40;
}
两个程序的输出均为40 40
我们正在传递var的地址副本,为什么它会反映在实际的main函数中并产生输出40 40
?
为什么这两个程序都产生相同的输出?
答案 0 :(得分:2)
两个程序都是等效的。在第一个中,您将指针传递给指针(即指针变量的地址),然后将其解除引用两次。在第二个中,您只是传递指针(即实际变量的地址)并将其解除引用一次。
答案 1 :(得分:2)
答案 2 :(得分:1)
输出相同,因为您通过指向40
的相同指针编写int
。在第二种情况下,您传递指针指向int,您已使用*
运算符成功取消引用,并获取类型为int
的左值,然后您将40
写入其中。在第一种情况下,您将指向指针传递给int。然后你进行双重解除引用:**ptr
或与*(*ptr)
相同。首先应用内部*
,并在大括号内使用类型指针指向int的表达式,并且指针指向int与第二种情况下传递给Change()
的指针相同。最后 - 外部*
就像第二种情况一样。
答案 3 :(得分:1)
&var
传递var
的地址,Change
使用双指针,因为var
指向a
的地址。因此,在&var
(var的地址)上取消指定单个指针将指向存储在var
即a
的地址中的值,因此再次对其进行解除,将指向的值a
即30
。
对于单指针Change
,我认为,你应该从上面的细节中找出答案。