双指针-输出说明

时间:2019-10-30 22:41:58

标签: c double-pointer

#include <stdio.h>
int main(void){

    int a=1,b=2,c=3; int *p,*q,**r; p=&a;
    r=&q;
    q=&c;
    a=*q+**r;
    printf("x=%d y=%d z=%d\n",**r,*p,*q); 
    *r=p;
    a=*q+**r;
    printf("w=%d\n",a);
    return 0;
}

输出:

x=3 y=6 z=3
w=12

我能够正确预测输出,但是不确定是否对z的输出有正确的解释。

请查看我是否有正确的理解:

  • *r=p;执行之前,我们有a=6,b=2,c=3
  • 执行*r=p;时,r指向的位置的值将更改为p
  • 现在r指向地址为q的{​​{1}},所以现在c的地址为q,因为a指向{ {1}}。因此,p现在指向a。因此q给出6。
  • 由于a仍指向*q,并且r指向q,因此q给出6。
  • 所以a

这是正确的解释吗?

2 个答案:

答案 0 :(得分:2)

让我们分解一下:

  1. int a=1,b=2,c=3;

    a = 1
    b = 2
    c = 3
    
  2. int *p,*q,**r;

    p --> ?
    q --> ?
    r --> ? --> ?
    
  3. p=&a;

    p --> a = 1
    q --> ?
    r --> ? --> ?
    
  4. r=&q;

    p --> a = 1
    q --> ?
    r --> q --> ?
    
  5. q=&c;

    p --> a = 1
    q --> c = 3
    r --> q --> c = 3
    
  6. 从上一点可以看出,
  7. a=*q+**r;有:

    a = 3 + 3 = 6
    
  8. printf("x=%d y=%d z=%d\n",**r,*p,*q);打印:

    x=3 y=6 z=3
    
  9. *r=p;。这是偷偷摸摸的:自*r == q起,这更改了q。这与执行q=p相同。这样我们得到:

    p --> a = 6
    q --> a = 6
    r --> q --> a = 6
    
  10. 从上一点可以看出,
  11. a=*q+**r;有:

    a = 6 + 6 = 12
    
  12. printf("w=%d\n",a);打印:

    w=12
    

结论:您的解释正确

答案 1 :(得分:0)

是的。 * r = p会使项r指向q,指向与p相同的地址,即&a。 ** r与* q相同,* q是&a处的值为6。