双指针 - 输出说明

Double pointers - output explanation

#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 将使项目 r 指向 q 指向与 p 相同的地址,即 &a。 **r 与 *q 相同,即 &a 处的值为 6。

让我们分解一下:

  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. a=*q+**r;,从上一点可以看出,我们有:

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

    x=3 y=6 z=3
    
  8. *r=p;。这是偷偷摸摸的:自 *r == q 以来,这改变了 q。这与 q=p 相同。所以我们得到:

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

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

    w=12
    

结论:你的解释是正确的