【问题标题】:Double pointers - output explanation双指针 - 输出说明
【发布时间】:2019-10-30 22:41:58
【问题描述】:
#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 指向地址为cq,所以现在q 的地址为a,因为p 指向a。所以q 现在指向a。所以*q 给出 6。
  • 因为r仍然指向q,而q指向a,所以**r给出6。
  • 所以*q + **r = 6+6=12

这是正确的解释吗?

【问题讨论】:

    标签: c double-pointer


    【解决方案1】:

    让我们分解一下:

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

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

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

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

      p --> a = 1
      q --> ?
      r --> q --> ?
      
    5. q=&amp;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
      

    结论:你的解释是正确的

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        相关资源
        最近更新 更多