0

次のコードでは、char ポインターと FILE ポインターを作成し、両方を「もちろん値で」関数に渡そうとしました。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void move(char *s){
    ++s;
}
void moveF(FILE *f){
    getc(f);
}
int main(){
    char *s = malloc(64);
    strcpy(s,"123456");
    puts(s);
    move(s);
    puts(s);

    //~~~~~~~~~~
    FILE *f = fopen("file1","r");
    printf("%d\n",(int)ftell(f));
    moveF(f);
    printf("%d\n",(int)ftell(f));
}

値渡しとは、パラメーターが呼び出し元の関数の元の変数のコピーであることを意味することを知っています。そのため、char ポインターを渡した後、メイン関数の値がまったく変更されていないことに気付くことができますが、奇妙なのはFILE ポインターを渡してパラメーターの値を変更すると、main 関数内の変数の値が変更されました。

誰かがこの動作を説明してください。ありがとう。

4

1 に答える 1

0

オブジェクトへのポインターを渡すことは、オブジェクトを参照渡しすることと同じです。FILEしたがって、参照によって構造体を渡しています。どちらの関数のポインターもメモリ内の同じオブジェクトを指しているため、どちらもオブジェクトを変更し、他の変更を確認できます。

于 2015-10-10T01:20:10.667 に答える