难以理解指针输出

时间:2016-07-06 07:06:13

标签: c pointers

请看下面的代码:

#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

为什么这两个程序都产生相同的输出?

4 个答案:

答案 0 :(得分:2)

两个程序都是等效的。在第一个中,您将指针传递给指针(即指针变量的地址),然后将其解除引用两次。在第二个中,您只是传递指针(即实际变量的地址)并将其解除引用一次。

答案 1 :(得分:2)

在我看来,您需要以下插图来获得q:

的答案

Pointers Diagram

答案 2 :(得分:1)

输出相同,因为您通过指向40的相同指针编写int。在第二种情况下,您传递指针指向int,您已使用*运算符成功取消引用,并获取类型为int的左值,然后您将40写入其中。在第一种情况下,您将指向指针传递给int。然后你进行双重解除引用:**ptr或与*(*ptr)相同。首先应用内部*,并在大括号内使用类型指针指向int的表达式,并且指针指向int与第二种情况下传递给Change()的指针相同。最后 - 外部*就像第二种情况一样。

答案 3 :(得分:1)

&var传递var的地址,Change使用双指针,因为var指向a的地址。因此,在&var(var的地址)上取消指定单个指针将指向存储在vara的地址中的值,因此再次对其进行解除,将指向的值a30

对于单指针Change,我认为,你应该从上面的细节中找出答案。