指针在内存中的作用域

Scope of a pointer in memory

这几周我一直在学习C,但是我不能完全理解内存是如何管理指针的。

我的问题来自于从此处获得的示例(第 17 页,共 19 页):C-Pointer-Basics

示例代码:

 #include <stdio.h>

 void F(int, int *);

 int main()
 {
     int m = 3;
     int n = 5;

     F(m, &n);

     printf("main: %d, %d\n", m, n); // print 3 7 (Where does the 7 came from?)

     return 0;
 }

 void F(int a, int *b)
 {
     /*
      * `a` being a local variable, gets cleaned after `F()` ends
      *  BUT how does `b` retain the value of `&a`?
      */

     a = 7;
     *b = a; // `*b = 7`
     b = &a; // `b` points to `a`
     *b = 4; // `a = 4` and why `*b` doesn't return 4?

     printf("F: %d, %d\n", a, *b); // print 4 4
 }

这里的问题是:

为什么main()打印mn的值时,显示m = 3n = 7

我的假设:

据我所知,指针超出了声明它的函数的范围,因此在 void F(int a, int *b) 中,当不再需要该函数时,它会被销毁,与他的参数一样,但值int *b 是否保留在内存中(即使 int *b 已不存在)?所以如果这是真的,我们可以从内存中 'recover' 它并在 main().

中使用它

最佳,

为什么mn打印3,7的问题是因为第一个参数是按值传递的,所以它只是被复制,所以没有修改原来的m 正在发生,在 n 的情况下,您正在传递它的地址,因此当您执行 *b=a 时,a 的值将被复制到 n。然后,当您执行 b=&a 时,指针 b 现在开始指向 a 的地址,而不是 n 的地址。这就是为什么你第二次做 *b=4,你没有修改 n 而是 a.