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* 戻り値の型に変更し、メイン メソッドに次のように変更すると、error1 が発生します。

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

これはポインタを間違って使用している例ですか、それとも何か間違ったことをしていますか?

4

5 に答える 5

5

関数「getInFile」が変更できるように、FILE ポインターのアドレスを渡す必要があります。このような:

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

次に、メインで次のように呼び出します。

getInFile(argv[2], &inFile);
于 2012-09-11T06:47:14.010 に答える
1

C 関数内の何かを変更したい場合は、その関数へのポインターを渡し、そのポインターが指すものを変更する必要があります。例えば:

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

これは、実際の ではなくのコピーxが渡されyたためです。そのコピーに加えた変更は、発信者には反映されません。xx

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 に答える
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 に答える
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 に答える