双指针 - 输出说明
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;
执行之前,我们有 a=6,b=2,c=3
.
- 执行
*r=p;
时,r
指向的地方的值变为p
.
- 现在
r
指向地址为 c
的 q
,所以现在 q
的地址为 a
因为 p
指向至 a
。所以 q
现在指向 a
。所以 *q
给出 6.
- 由于
r
仍然指向q
,而q
指向a
,**r
给出6.
- 所以
*q + **r = 6+6=12
这是正确的解释吗?
是的。 *r = p 将使项目 r 指向 q 指向与 p 相同的地址,即 &a。
**r 与 *q 相同,即 &a 处的值为 6。
让我们分解一下:
int a=1,b=2,c=3;
a = 1
b = 2
c = 3
int *p,*q,**r;
p --> ?
q --> ?
r --> ? --> ?
p=&a;
p --> a = 1
q --> ?
r --> ? --> ?
r=&q;
p --> a = 1
q --> ?
r --> q --> ?
q=&c;
p --> a = 1
q --> c = 3
r --> q --> c = 3
a=*q+**r;
,从上一点可以看出,我们有:
a = 3 + 3 = 6
printf("x=%d y=%d z=%d\n",**r,*p,*q);
打印:
x=3 y=6 z=3
*r=p;
。这是偷偷摸摸的:自 *r == q
以来,这改变了 q
。这与 q=p
相同。所以我们得到:
p --> a = 6
q --> a = 6
r --> q --> a = 6
a=*q+**r;
,从上一点可以看出,我们有:
a = 6 + 6 = 12
printf("w=%d\n",a);
打印:
w=12
结论:你的解释是正确的。
#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
指向地址为c
的q
,所以现在q
的地址为a
因为p
指向至a
。所以q
现在指向a
。所以*q
给出 6. - 由于
r
仍然指向q
,而q
指向a
,**r
给出6. - 所以
*q + **r = 6+6=12
这是正确的解释吗?
是的。 *r = p 将使项目 r 指向 q 指向与 p 相同的地址,即 &a。 **r 与 *q 相同,即 &a 处的值为 6。
让我们分解一下:
int a=1,b=2,c=3;
a = 1 b = 2 c = 3
int *p,*q,**r;
p --> ? q --> ? r --> ? --> ?
p=&a;
p --> a = 1 q --> ? r --> ? --> ?
r=&q;
p --> a = 1 q --> ? r --> q --> ?
q=&c;
p --> a = 1 q --> c = 3 r --> q --> c = 3
a=*q+**r;
,从上一点可以看出,我们有:a = 3 + 3 = 6
printf("x=%d y=%d z=%d\n",**r,*p,*q);
打印:x=3 y=6 z=3
*r=p;
。这是偷偷摸摸的:自*r == q
以来,这改变了q
。这与q=p
相同。所以我们得到:p --> a = 6 q --> a = 6 r --> q --> a = 6
a=*q+**r;
,从上一点可以看出,我们有:a = 6 + 6 = 12
printf("w=%d\n",a);
打印:w=12
结论:你的解释是正确的。