0

首先,如果你们以前都看过这个,请道歉。我尽我最大的努力尝试在这里和其他地方找到答案。

我是 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 方法中有:

inFile = getInFile(argv[2], inFile);

这是我错误地使用指针的例子还是我做错了什么?

4

5 回答 5

5

您需要传递 FILE 指针的地址,以便函数“getInFile”可以修改它。像这样:

void getInFile(char fileName[], FILE **inFile) {
    *inFile = fopen(fileName, "r");
    if(*inFile == NULL) {
        printf("Error1");
    }
}

然后在 main 中调用它:

getInFile(argv[2], &inFile);
于 2012-09-11T06:47:14.010 回答
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);
于 2012-09-11T06:48:58.563 回答
1

如果要更改 C 函数中的某些内容,则需要将指针传递给它并更改其指向的内容。例如:

void xyzzy (int x, int *py) {
    x = 42;
    *py = 42;
}
:
x = y = 0;
xyzzy (x, &y);

将导致x仍然持有 0 和y持有 42。那是因为传递了 的副本x而不是真正的x. 您对该副本所做的任何更改都不会反映给调用者。

传递了指向 y 的指针的副本(C 始终是按值传递而不是按引用传递)但是,由于该副本和原始&y指向相同 y,所以它起作用了。


现在,您也必须将其应用于指针。如果要更改指针,则需要将指针传递给该指针并取消引用它,例如:

void getInFile (char fileName[], FILE **pInFile) {
    *pInFile = fopen (fileName, "r");
    if (*pInFile == NULL) {
        printf("Error1");
    }
}
:
FILE *inFile = NULL;
getInFile (argv[2], &inFile);
于 2012-09-11T06:50:25.910 回答
0

getFile 中的分配对调用者没有可见的影响。您需要制作 getFile(FILE **infile) 并将分配更改为 *infile = fopen

于 2012-09-11T06:49:34.750 回答
0

getInFile(argv[2], inFile ); 在这里,inFile 是函数的输入参数。该功能不会改变它。如果 inFile 实际指向了某个东西,函数当然会改变指向的变量,但是指针本身是不能改变的。

所有参数都是如此,它们本身永远无法更改,如果您希望某些内容可以更改,则必须给它一个指针。

于 2012-09-11T06:52:20.827 回答