指针在内存中的作用域
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()
打印m
和n
的值时,显示m = 3
和n = 7
?
我的假设:
据我所知,指针超出了声明它的函数的范围,因此在 void F(int a, int *b)
中,当不再需要该函数时,它会被销毁,与他的参数一样,但值int *b
是否保留在内存中(即使 int *b
已不存在)?所以如果这是真的,我们可以从内存中 'recover' 它并在 main()
.
中使用它
最佳,
为什么m
和n
打印3,7
的问题是因为第一个参数是按值传递的,所以它只是被复制,所以没有修改原来的m
正在发生,在 n
的情况下,您正在传递它的地址,因此当您执行 *b=a
时,a
的值将被复制到 n
。然后,当您执行 b=&a
时,指针 b
现在开始指向 a
的地址,而不是 n
的地址。这就是为什么你第二次做 *b=4
,你没有修改 n
而是 a
.
这几周我一直在学习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()
打印m
和n
的值时,显示m = 3
和n = 7
?
我的假设:
据我所知,指针超出了声明它的函数的范围,因此在 void F(int a, int *b)
中,当不再需要该函数时,它会被销毁,与他的参数一样,但值int *b
是否保留在内存中(即使 int *b
已不存在)?所以如果这是真的,我们可以从内存中 'recover' 它并在 main()
.
最佳,
为什么m
和n
打印3,7
的问题是因为第一个参数是按值传递的,所以它只是被复制,所以没有修改原来的m
正在发生,在 n
的情况下,您正在传递它的地址,因此当您执行 *b=a
时,a
的值将被复制到 n
。然后,当您执行 b=&a
时,指针 b
现在开始指向 a
的地址,而不是 n
的地址。这就是为什么你第二次做 *b=4
,你没有修改 n
而是 a
.