C函数内的文件指针更改

File pointer change inside a C function

我想问一下为什么可以在C函数中更改文件的指针值而不传递对它的引用,我的意思是:

void fun(FILE *f)
{
    fclose(f);
    f = fopen("newfile", "r");
}

int main(void)
{
    FILE *old = fopen("file", "r");
    char *msg = (char*)malloc(sizeof(char) * 100);
    fun(old);
    fscanf(old, "%s", msg);
    printf("%s", msg);
    free(msg);
    return 0;
}

谁能给我解释一下?我以为正在复制指针,所以我预计会收到有关已关闭文件的错误。没想到居然没看懂

已复制,但仍指向同一个文件。

C 中的参数按值 传递,这意味着它们被复制。所以函数永远不会有原始值,只有副本,修改副本当然不会修改原始值。

您可以通过使用指针来模拟通过引用传递,并且在通过引用传递指针的情况下,您当然必须将指针传递给指针(通过使用地址运算符 &).

void fun(FILE **f)
{
    fclose(*f);
    *f = fopen("newfile", "r");
}

...

fun(&old);