C语言 如何可视化代码片段中的指针?



我发现很难可视化这段代码。我似乎找不到这方面的理由。

我确实得到了

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 

在此声明中,指针pq通过引用函数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交换rs指向。也就是说,在此代码段之后,指针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.

最后,该函数返回变量ab的初始值之和

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。

当指针pq在函数中交换时,现在指针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的左值。

最新更新