为什么FILE *不存储打开文件的地址

#include  FILE * Openfile(char *filename,char *mode, FILE *fp); int main(){ FILE *fp=NULL; char *filename = "simple_index.file"; char *openmode = "w"; printf("FP(before call function):%p\n", fp); FILE *newfp = Openfile(filename, openmode, fp); printf("FP(after call function): %p\nNEWFP: %p\n", fp, newfp); return 0; } FILE * Openfile(char *filename,char *mode, FILE *fp){ printf((fp = fopen(filename, mode)) ? "Good opening %s file\n": "Error open %s file\n", filename); return fp; } 

结果:

 FP(before call function):0x0 Good opening simple_index.file file FP(after call function): 0x0 NEWFP: 0x800bc7140 

在调用Openfile()函数中使用函数打开文件后,指向文件结构的指针不存储打开文件的地址。

为什么FP在function中使用后不保存状态? 为什么需要回来保存?

这是因为C使用pass-by-value进行函数参数传递。

如果你想对从该函数本身作为参数传递的变量进行更改,你需要一个指向该变量的指针传递给函数,并且在函数内部,你可以修改指向的值。指针和调用者,它将持续存在。

否则,要从被调用函数return值,通常我们return该值并将其分配给调用函数中的变量。

fopen存储更新的指针,但访问您需要提供指针的地址。

试试:

 FILE *newfp = Openfile(filename, openmode, &fp); FILE * Openfile(char *filename,char *mode, FILE **fp){ printf((*fp = fopen(filename, mode)) ? "Good opening %s file\n": "Error open %s file\n", filename); return *fp; } 

现在*fpnewfp将打印相同的值

将function更改为:

 FILE * Openfile(char *filename,char *mode, FILE **fpp){ printf((*fpp = fopen(filename, mode)) ? "Good opening %s file\n": "Error open %s file\n", filename); return *fpp; } 

然后像这样调用它:

 FILE *newfp = Openfile(filename, openmode, &fp);