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

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 

在此声明中,指针 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;

实际上交换了指针rs指向的指针pq。也就是说,在此代码片段之后,指针 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变量ab初始值之和

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。

由于指针pq在函数中被交换,所以现在指针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.

的左值