求助指针问题

老师您好,下面这个两个题的代码和输出结果,把我对指针的理解完全搞乱了。
请老师最好画图,进行详细说明,非常感谢!
#include <stdio.h>
int k = 7, m = 5;

void f(int **s)
{
    int *t = &k;
    s = &t;
    *s = &m;
    printf("%d, %d, %d,", k, *t, **s);
}

main()
{
    int i = 3, *p = &i, **r = &p;
    f(r);
    printf("%d, %d, %d\n", i, *p, **r);
}
输出结果是7 5 5 3 3 3
下面是第二题的
#include <stdio.h>
int k = 7;
void f(int **s)
{
    int *t = &k;
    *s = t;
    printf("%d, %d, %d,", k, *t, **s);
}

main()
{
    int i = 3, *p = &i, **r = &p;
    f(r);
    printf("%d, %d, %d\n", i, *p, **r);
}
输出结果是:7 7 7 3 7 7
期待您的答疑解惑!

小象老师

赞同来自:

请问是哪个课的问题?

fish - Hadooper

赞同来自:

先对第一段代码进行描述,你再对第二段代码的理解进行下回复,我们共同讨论下如何?   第一段代码片段:
int i = 3, *p = &i, **r = &p;
这之后,各变量释义为:
image.png
 调用f(r),函数f(int **s)的参数类型为指向int指针的指针,形参s被赋值为r相同的值:
image.png
在函数f(int **s)的实现中,
 int *t = &k;
这句执行之后,变为
image.png
  然后执行s = &t,这句赋值表示是s这个指针的指针变量的内容,变为t的地址,于是变成这样:
2.png
然后执行*s = &m,这句表示将s这个变量指向的地址中的内容(其实就是t变量),赋值为m的地址,于是变成这样:
1.png
然后在函数f中调用打印语句 printf("%d, %d, %d,", k, *t, **s),打印的就是:7 5 5。   f执行完成,再调用printf("%d, %d, %d\n", i, *p, **r),打印的就是:3 3 3。

linxi

赞同来自:

#include <stdio.h> int k = 7; void f(int **s) {     int *t = &k;     *s = t;     printf("%d, %d, %d,", k, *t, **s); } main() {     int i = 3, *p = &i, **r = &p;     f(r);     printf("%d, %d, %d\n", i, *p, **r); } 输出结果是:7 7 7 3 7 7 您好, 根据您的提示我画了个图,比较乱,大概能够得出答案
1.jpg
请指点

fish - Hadooper

赞同来自:

我觉得变量的关系应该是这样:
image.png
 

linxi

赞同来自:

应该是的,你的理解比较规范。我是没有老师指导,自己的理解,比较山寨,有不正确的地方。不过自己的思路能够理顺下来,也可以用来解题了。

linxi

赞同来自:

谢谢

要回复问题请先登录注册