c - 内存中指针的范围
问题描述
过去几周我一直在研究 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()
打印 and 的值时m
,n
它显示m = 3
and n = 7
?
我的假设:
据我所知,指针超出了声明它的函数的范围,因此void F(int a, int *b)
当不再需要该函数时,它会被销毁,与他的参数相同,但值int *b
仍保留在内存中(即使int *b
不再存在)?因此,如果这是真的,我们可以从内存中“恢复”它并在main()
.
最好的,
解决方案
对于为什么m
和n
print的问题3,7
是因为第一个参数是按值传递的,因此它只会被复制,因此不会对原始参数进行任何修改,m
并且在 的情况下n
,您正在传递其地址,因此当您执行get*b=a
的值a
时复制到n
. 然后,当您执行b=&a
此操作时,指针b
现在开始指向地址a
而不是n
. 这就是为什么你第二次这样做*b=4
,你不是在修改n
而是a
。
推荐阅读
- c# - 使用 Aspnet.core 创建并返回带有图像的 pdf
- excel - 子文件夹保存导致变量未定义错误,但它在我的第一个子文件夹中?
- android - 是否可以在 Android Studio 中创建可翻译的任意 XML 资源?
- python - 按优先级对 Python 字典进行排序
- php - 使用 nginx 反向代理服务非静态 laravel 文件
- java - 用 Java Regex 匹配前面没有百分号的字母字符
- python - 在 Arch Linux 上使用 geckodriver(0.24.0) 运行 selenium(3.141.0) 时无法找到一组匹配的功能
- java - ItextRender 未在 pdf 中显示 xhtml 内容
- reactjs - 需要帮助在 JSX 中设置条件
- jquery - 为什么我的切换开关不会在点击时改变状态?