指针做全局变量的疑问

Sybil_aoi 2017-11-15 09:41:14
我在程序中定义了两个全局的指针变量(FILE *fio ;FILE *fou)
存储文件地址(fio=fopen......)
因为是读取某个文件然后再创建文件的程序,所以两个地址在整个程序里都不会再改变,出于使用方便考虑定义成了全局变量。
但我发现,在我写的OpenAndCreate函数里面为两个指针赋值后(fio=fopen....; fou=fopen...;),再回到main里时,两个指针又变回了NULL,就好像初学指针时老师都会举的不能直接在函数里改变量的值的例子一样。
但是他们两个是全局变量啊?
于是我写了一个简短的程序来实验(格式不规范请见谅)
#include<stdio.h>
#include<stdlib.h>

int a=5;
int b=6;
int *In_0=&a;
int *In_1;
bool Calculate(int *In_0,int *In_1);

int main()
{
Calculate(In_0,In_1);
system("pause");
}

bool Calculate(int *In_0,int *In_1)
{
In_0=&b;
In_1=&b;
a=7;
return true;
}



结果,a的值顺利变成了7,而两个指针只在Calculate函数里才指向b,回到main后In_0又指回了a(值当然是7),In又变成了NULL。我查了一下,但大家都说和普通的全局变量一样用就可以了,可是他们两个在这边表现得根本不像个全局变量啊,a的值都乖乖改变了的。请问这是什么情况?
...全文
616 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻想0051 2017-11-16
  • 打赏
  • 举报
回复
你的指针也是变量,指针作为参数的话,也是值传递的,修改形参的指针,实参的指针是不会变的;修改形参的指针指向的值,实参的指针指向的值才会变,因为他们都是指向同一块内存。吧指针的地址传进去,然后修改
自信男孩 2017-11-16
  • 打赏
  • 举报
回复
bool Calculate(int *In_0,int  *In_1)
{
    In_0=&b;
    In_1=&b;
    a=7;
    return true;
}
函数Calculate中参数In_0, In_1是局部变量,按照参数值传递的原理,这两个形参得到了全局变量指针的值,即他们(全局指针)指向的内容地址;在Calculate函数里并没有修改实参的指针指向。如果需要通过传参数修改全局指针,可以考虑传二重指针,如下:
#include<stdio.h>
#include<stdlib.h>
 
int a=5;
int b=6;
int *In_0=&a;
int *In_1;
bool Calculate(int *In_0,int  *In_1);
 
int main()
{
    Calculate(&In_0, &In_1);
    system("pause");
}
 
bool Calculate(int **In_0,int  **In_1)
{
    *In_0=&b;
    *In_1=&b;
    a=7;
    return true;
}
这样修改的即全局指针的指向;
棉猴 2017-11-16
  • 打赏
  • 举报
回复
正如楼上所说的,这应该是嵌套作用域的知识点。 《C++Primer第5版中文版》第44页提到 作用域中一旦声明了某个名字,它所嵌套着的所有作用域都能访问该名字,同时,允许在内层作用域中重新定义外层作用域已有的名字。 在你的程序中,整个程序可以看成是外层作用域,而函数Calculate()看成是内层作用域。在Calculate()的内层作用域中,变量In_0和In_1表示的不是全局变量(外层作用域),而是函数Calculate()的形参。 《C++Primer第5版中文版》第188页提到 当函数的参数是值传递(非引用类型)时,函数对形参做的所有操作都不会影响实参。 所以在Calculate()中对变量In_0和In_1赋值,不会影响实参变量In_0和In_1(全局变量)。
paschen 版主 2017-11-15
  • 打赏
  • 举报
回复
引用 2 楼 Sybil_aoi 的回复:
引用 1 楼 paschen 的回复:
既然是全局变量,就不需要通过参数传递给Calculate函数。就算要传,你应该传的是这个指针本身的地址,你写成bool Calculate(int *In_0,int *In_1)是按值传递的,也就是函数中的形参是实参复制来的,你修改的只是一个复制品,并不是真正的实参,即你的全局变量
是,我发现了,因为函数的定义是老师原本给的,我改的时候就完全没有注意到我已经把他们改成全局变量了所以不需要传递,写这个实验程序也是照抄格式没注意到。不过,我把函数定义改成bool Calculate(int *c,int *d)就能如我所想运行了。如果照你所说,这种修改应该不会有效才对?我想是因为我给形参和实参取了一样的名字,所以函数里的那两个In实际上并非我的全局变量而是属于这个函数的复制(哎?这么一说好像又和你的意思是一样的......)所以,这是个命名不当引发的血案,这么总结对吗?
函数参数只是函数中的局部变量,如果和全局变量一样,函数中使用In_0表示的是函数中的局部变量,::In_0才能表示全局变量
Sybil_aoi 2017-11-15
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
既然是全局变量,就不需要通过参数传递给Calculate函数。就算要传,你应该传的是这个指针本身的地址,你写成bool Calculate(int *In_0,int *In_1)是按值传递的,也就是函数中的形参是实参复制来的,你修改的只是一个复制品,并不是真正的实参,即你的全局变量
是,我发现了,因为函数的定义是老师原本给的,我改的时候就完全没有注意到我已经把他们改成全局变量了所以不需要传递,写这个实验程序也是照抄格式没注意到。不过,我把函数定义改成bool Calculate(int *c,int *d)就能如我所想运行了。如果照你所说,这种修改应该不会有效才对? 我想是因为我给形参和实参取了一样的名字,所以函数里的那两个In实际上并非我的全局变量而是属于这个函数的复制(哎?这么一说好像又和你的意思是一样的......) 所以,这是个命名不当引发的血案,这么总结对吗?
paschen 版主 2017-11-15
  • 打赏
  • 举报
回复 1
既然是全局变量,就不需要通过参数传递给Calculate函数。就算要传,你应该传的是这个指针本身的地址,你写成bool Calculate(int *In_0,int *In_1)是按值传递的,也就是函数中的形参是实参复制来的,你修改的只是一个复制品,并不是真正的实参,即你的全局变量

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧