首先,如果你以前见过这个,请道歉。我努力尝试在这里和其他地方找到答案。
我是C的新手,仍然专注于指针和有效使用它们。
代码(为简洁起见编辑):
void getInFile(char fileName[], FILE *inFile) {
inFile = fopen(fileName, "r");
if(inFile == NULL) {
printf("Error1");
}
}
void function(FILE *inFile) {
if(inFile == NULL) {
printf("Error2");
}
}
int main(int argc, char *argv[]) {
FILE *inFile = 0;
getInFile(argv[2], inFile);
function(inFile);
}
如上所述,运行程序会产生错误2。如果我将getInFile从void更改为FILE *返回类型并且在main方法中有以下内容我得到error1:
inFile = getInFile(argv[2], inFile);
这是我使用指针不正确的例子还是我做错了什么?
答案 0 :(得分:5)
您需要传递FILE指针的地址,以便函数'getInFile'可以修改它。像这样:
void getInFile(char fileName[], FILE **inFile) {
*inFile = fopen(fileName, "r");
if(*inFile == NULL) {
printf("Error1");
}
}
然后在主要调用它:
getInFile(argv[2], &inFile);
答案 1 :(得分:1)
void getInFile(char fileName[], FILE *inFile) {
inFile = fopen(fileName, "r");
if(inFile == NULL) {
printf("Error1");
}
}
您将inFile
参数作为参数传递 - 它是按值传递的,无论您是否在函数内部对其进行修改,该函数都在副本上运行,因此改变不会暴露在功能之外的世界。尝试传递其地址(即双指针):
void getInFile(char fileName[], FILE **inFile) {
*inFile = fopen(fileName, "r");
if (*inFile == NULL) {
printf("Error1");
}
}
FILE *ptr;
getInFile("Filename", &ptr);
答案 2 :(得分:1)
如果你想改变C函数中的某些东西,你需要传递一个指向它的指针并改变它指向的东西。例如:
void xyzzy (int x, int *py) {
x = 42;
*py = 42;
}
:
x = y = 0;
xyzzy (x, &y);
会导致x
仍然保持为0,而y
仍然保持为42.这是因为传递了x
的副本,而不是真正的{{1} }}。您对该副本所做的任何更改都不会反映给调用者。
指针到y的副本也传递(C总是按值传递而不是传递引用)但是,因为该副本和原始{{ 1}}指向相同的 x
,它有效。
现在,您还必须将其应用于指针。如果要更改指针,则需要将指针传递给该指针并取消引用它,例如:
&y
答案 3 :(得分:0)
getFile中的赋值对调用者没有任何影响。你需要 制作getFile(FILE ** infile) 并将作业更改为* infile = fopen
答案 4 :(得分:0)
getInFile(argv [2], inFile ); 在这里,inFile是函数的输入参数。没有任何功能可以改变它。如果inFile实际指向某事,函数过程当然会改变指向的变量,但指针本身不能改变。
对于所有参数都是如此,它们永远不能自行更改,如果您想要更改某些内容,则必须指定它。