#include <stdio.h>
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
在函数中使用后不保存状态?为什么需要回来保存?
答案 0 :(得分:7)
这是因为C
使用pass-by-value进行函数参数传递。
如果你想对从该函数本身作为函数参数传递的变量进行更改,你需要一个指向该变量的指针传递给函数并在函数内部,你可以修改指针和调用者指向的值,它将持续存在。
否则,要从被调用函数返回值,通常我们return
该值并将其分配给调用函数中的变量。
答案 1 :(得分:5)
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;
}
存储更新的指针,但要访问您需要提供指针的地址。
尝试:
*fp
现在newfp
和{{1}}将打印相同的值
答案 2 :(得分:2)
将功能更改为:
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);