据我所知,传递指向函数的指针实际上是将指针的副本传递给C中的函数。我有一个FILE
指针,我将其传递给函数func()
,{{ 1}}从文件中读取一行,然后返回func()
。我使用相同的main()
指针从文件中读取另一行。
然而,虽然我可以想象我在调用FILE
之前准确读取了这一行,但我实际上是在func()
读完之后阅读了下一行。 您能否解释为什么func()
指针会以这种方式运行?
这是我的代码:
FILE
答案 0 :(得分:3)
然而,虽然我会想象我在调用func之前完全读取了这行...
我无法想象为什么你会这么想。如果FILE*
引用一个没有重放功能的网络连接,那么读取消耗的情况会怎样?该行存储在哪里,以便您可以再次阅读?绝对没有地方可以把它放进去。
我不仅不想象,这有点疯狂。
据我所知,传递指向函数的指针实质上是将指针的副本传递给C中的函数。
正确。但是指针的副本指向同一个对象。如果我指着一辆汽车并且你复制了我,那么你指的是同一辆汽车,而且只指向我所指的汽车。
答案 1 :(得分:1)
因为FILE
指针指向读取/写入文件时会更改的某些数据。
因此指针不会发生变化(仍指向文件的处理程序结构),但结构指向的数据会发生变化。
尝试将指针传递为const FILE *
您将看到您不能,因为fread
操作(以及其他操作)会改变指向的数据。
一种方法是复制dup
所做的文件描述符,但不对缓冲的FILE
对象起作用,只对原始文件描述符起作用。
答案 2 :(得分:1)
问题在于您的初始陈述:
As far as I understand passing a pointer to a function essentially passes the copy of the pointer to the function in C
。
这并没有太大变化,因为无论你作为一个指针访问什么,仍然保持你正在访问的FILE
的位置,使用指针作为C中函数的参数的全部要点是这样的您可以修改函数范围之外的某个值。
例如,通常使用整数指针作为函数参数:
void DoSomethingCool(int *error);
现在使用此代码来捕获错误将如下所示:
int error = 0;
DoSomethingCool(&error);
if(error != 0)
printf("Something really bad happened!");
换句话说,指针实际上会修改整数错误,方法是访问它的位置并写入它。
要记住避免这些误解的重要一点是要认识到所有指针都是某种东西的地址。
所以你可以(理论上,通过简化一切)将int *
简单地想象为int
,其值恰好是某个变量的地址,对于{{ 1}},您可以将其视为FILE *
,其中int的值是int
变量的位置。
答案 3 :(得分:1)
FILE *fd
只是指针,它的实现使用C构造,称为"指针"。在表示文件位置的意义上,不是指针。
FILE *fd
表示I / O库中文件对象的句柄,struct
包含文件的实际位置。以极简化的方式,您可以将fd
视为指向文件指针的C指针。
当您在程序周围传递fd
时,I / O例程会对文件位置进行修改。 fd
的所有用户共享此职位。如果func()
通过阅读某些数据或致电fseek
对该位置进行了更改,则相同fd
的所有用户都会看到更新后的位置。