微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针在内存中的作用域

如何解决指针在内存中的作用域

过去几周我一直在学习 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,a,*b); // print 4 4
 }

这里的问题是:

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

我的假设:

据我所知,指针超出了声明它的函数的范围,因此在 void F(int a,int *b) 中不再需要该函数时,它会被销毁,与他的参数相同,但是 int *b 的值{1}} 是否保留在内存中(即使 int *b 不再存在)?因此,如果这是真的,我们可以从内存中“恢复”它并在 main() 中使用它。

最好,

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。