次のコードでは、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 関数内の変数の値が変更されました。
誰かがこの動作を説明してください。ありがとう。