如何可视化代码片段中的指针?
How to visualize the pointers in the code snippet?
我发现很难想象这段代码。我似乎找不到答案。
我确实得到了
的答案
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
但其他变量与答案不匹配。请帮忙。
int f(int ** r, int ** s) {
int temp = ** r;
int temp2 = **s;
int * z = *r;
*r = *s;
*s = z;
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
*z += 3;
**s -= 8;
**r -= 19;
return temp + temp2;
}
int main(void) {
int a = 80;
int b = 12;
int * p = &a;
int * q = &b;
int x = f(&p, &q);
printf("x = %d\n", x);
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
printf("a = %d\n", a);
printf("b = %d\n", b);
return EXIT_SUCCESS;
}
预期输出:
**r = 12
**s=80
x=92
*p=-7
*q=75
a=75
b=-7
在此声明中,指针 p
和 q
通过引用传递给函数 f
。
int x = f(&p, &q);
指针p
指向变量a
,指针q
指向变量b
。
int a = 80;
int b = 12;
int * p = &a;
int * q = &b;
在函数内 f
声明为
int f(int ** r, int ** s);
指针r
指向指针p
,指针s
指向指针q
。
相应地在这些声明中
int temp = ** r;
int temp2 = **s;
变量temp
由变量a
的值初始化,变量temp2
由变量b
的值初始化。
你范成像这些声明像
int temp = a;
int temp2 = b;
在此代码段中
int * z = *r;
*r = *s;
*s = z;
实际上交换了指针r
和s
指向的指针p
和q
。也就是说,在此代码片段之后,指针 r
现在指向指针 q
并且指针 s
指向指针 p
.
你可以这样想象
*r = q;
*s = p;
中间变量z
int * z = *r;
获取指针的值p
。
你可以这样想象
int * z = p;
这条语句
*s = z;
没有更改 s
指向的值,因为在此语句之前变量 s
已经指向 p
由于之前交换了指针 [=40] 的指向值=] 和指针 s
.
所以 printf 的这些调用
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
对应的会输出b
的值和a
的值。
即输出将是
**r = 12
**s = 80
由于指针z
具有指针p
的值,那么在这条语句之后
*z += 3;
变量a
将增加3
并等于83
。
在这些陈述中
**s -= 8;
**r -= 19;
变量a
将减少8
并等于75
并且变量b
将减少19
并等于-7
.
最后函数returns变量a
和b
初始值之和
return temp + temp2;
即92
.
在主要的这些语句中
printf("x = %d\n", x);
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
printf("a = %d\n", a);
printf("b = %d\n", b);
这里输出了函数f的返回值
printf("x = %d\n", x);
也就是92。
由于指针p
和q
在函数中被交换,所以现在指针p
指向b
而指针q指向a
.
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
所以这些语句输出
*p = -7
*q = 75
以及这些陈述
printf("a = %d\n", a);
printf("b = %d\n", b);
输出a和b本身的新值即
a = 75
b = -7
至于这个说法
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
那么例如表达式*r
指向指针p
。所以像 *p
这样取消引用指针 p 与 *( *r )
相同,你将得到变量 a
.
的左值
我发现很难想象这段代码。我似乎找不到答案。
我确实得到了
的答案printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
但其他变量与答案不匹配。请帮忙。
int f(int ** r, int ** s) {
int temp = ** r;
int temp2 = **s;
int * z = *r;
*r = *s;
*s = z;
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
*z += 3;
**s -= 8;
**r -= 19;
return temp + temp2;
}
int main(void) {
int a = 80;
int b = 12;
int * p = &a;
int * q = &b;
int x = f(&p, &q);
printf("x = %d\n", x);
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
printf("a = %d\n", a);
printf("b = %d\n", b);
return EXIT_SUCCESS;
}
预期输出:
**r = 12
**s=80
x=92
*p=-7
*q=75
a=75
b=-7
在此声明中,指针 p
和 q
通过引用传递给函数 f
。
int x = f(&p, &q);
指针p
指向变量a
,指针q
指向变量b
。
int a = 80;
int b = 12;
int * p = &a;
int * q = &b;
在函数内 f
声明为
int f(int ** r, int ** s);
指针r
指向指针p
,指针s
指向指针q
。
相应地在这些声明中
int temp = ** r;
int temp2 = **s;
变量temp
由变量a
的值初始化,变量temp2
由变量b
的值初始化。
你范成像这些声明像
int temp = a;
int temp2 = b;
在此代码段中
int * z = *r;
*r = *s;
*s = z;
实际上交换了指针r
和s
指向的指针p
和q
。也就是说,在此代码片段之后,指针 r
现在指向指针 q
并且指针 s
指向指针 p
.
你可以这样想象
*r = q;
*s = p;
中间变量z
int * z = *r;
获取指针的值p
。
你可以这样想象
int * z = p;
这条语句
*s = z;
没有更改 s
指向的值,因为在此语句之前变量 s
已经指向 p
由于之前交换了指针 [=40] 的指向值=] 和指针 s
.
所以 printf 的这些调用
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
对应的会输出b
的值和a
的值。
即输出将是
**r = 12
**s = 80
由于指针z
具有指针p
的值,那么在这条语句之后
*z += 3;
变量a
将增加3
并等于83
。
在这些陈述中
**s -= 8;
**r -= 19;
变量a
将减少8
并等于75
并且变量b
将减少19
并等于-7
.
最后函数returns变量a
和b
初始值之和
return temp + temp2;
即92
.
在主要的这些语句中
printf("x = %d\n", x);
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
printf("a = %d\n", a);
printf("b = %d\n", b);
这里输出了函数f的返回值
printf("x = %d\n", x);
也就是92。
由于指针p
和q
在函数中被交换,所以现在指针p
指向b
而指针q指向a
.
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
所以这些语句输出
*p = -7
*q = 75
以及这些陈述
printf("a = %d\n", a);
printf("b = %d\n", b);
输出a和b本身的新值即
a = 75
b = -7
至于这个说法
printf("**r = %d\n",**r);
printf("**s = %d\n",**s);
那么例如表达式*r
指向指针p
。所以像 *p
这样取消引用指针 p 与 *( *r )
相同,你将得到变量 a
.