我发现很难可视化这段代码。我似乎找不到这方面的理由。
我确实得到了
printf("**r = %dn",**r);
printf("**s = %dn",**s);
但其他变量与 ANS 不匹配。请帮忙。
int f(int ** r, int ** s) {
int temp = ** r;
int temp2 = **s;
int * z = *r;
*r = *s;
*s = z;
printf("**r = %dn",**r);
printf("**s = %dn",**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 = %dn", x);
printf("*p = %dn", *p);
printf("*q = %dn", *q);
printf("a = %dn", a);
printf("b = %dn", 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;
实际上,指针p
和指针q
交换r
和s
指向。也就是说,在此代码段之后,指针r
现在指向指针q
,指针s
指向指针p
。
你可以像这样想象
*r = q;
*s = p;
中间变量z
int * z = *r;
获取指针p
的值。
你可以像这样想象
int * z = p;
此声明
*s = z;
没有更改s
指向的值,因为在此语句之前,变量s
已经指向p
,因为前面交换了指针r
和指针s
的指向值。
所以这些 printf 的调用
printf("**r = %dn",**r);
printf("**s = %dn",**s);
相应地将输出b
的值和a
的值。
那就是输出将是
**r = 12
**s = 80
由于指针z
具有指针的值,因此在此语句之后p
*z += 3;
变量a
将增加3
并等于83
。
在这些声明中
**s -= 8;
**r -= 19;
变量a
将减少8
并变为等于75
变量b
减少19
并等于-7
.
最后,该函数返回变量a
和b
的初始值之和
return temp + temp2;
那是92
.
在这些陈述中,主要
printf("x = %dn", x);
printf("*p = %dn", *p);
printf("*q = %dn", *q);
printf("a = %dn", a);
printf("b = %dn", b);
输出函数 f 返回的值
printf("x = %dn", x);
那是92。
当指针p
和q
在函数中交换时,现在指针p
指向b
,指针q指向a
。
printf("*p = %dn", *p);
printf("*q = %dn", *q);
所以这些语句输出
*p = -7
*q = 75
而这些陈述
printf("a = %dn", a);
printf("b = %dn", b);
输出 A 和 B 本身的新值,即
a = 75
b = -7
至于这个说法
printf("**r = %dn",**r);
printf("**s = %dn",**s);
然后例如表达式*r
指向指针p
。因此,像*p
一样取消引用指针 p,这与*( *r )
相同,您将获得变量a
的左值。