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

Spo*_*ouk 0 c

#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;

}
Run Code Online (Sandbox Code Playgroud)

结果:

FP(before call function):0x0
Good opening simple_index.file file
FP(after call function): 0x0
NEWFP: 0x800bc7140
Run Code Online (Sandbox Code Playgroud)

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

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

Sou*_*osh 7

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

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

否则,要从被调用函数返回值,通常我们return将值分配给调用函数中的变量.


Rik*_*yay 5

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;

}
Run Code Online (Sandbox Code Playgroud)

现在*fp,newfp将打印相同的值