南極の図書館

ペンギンが寝ていた…。

プログラミング言語C第2版(K&R)のP36、配列の参照渡しについて

仕事でCを使う必要に迫られたのでプログラミング言語C第2版(K&R)を1から読んでいたら、P36で30分くらい悩んでしまったので備忘として。

void copy( char to[], char from[] )
{
    int i;

    i = 0;
    while( (to[i] = from[i]) != '\0' )
        ++i;
}

mainから呼ばれるcopyという設定なのだが、なぜこれで元の配列の値を更新できるのかしばらく理解できず。考えてみれば当たり前なんだけど、配列なんか値で渡せるわけがなく、JavaScriptのオブジェクトと一緒で参照渡しだった。


で、私がなんでこんな簡単なことで悩んでたかというと、直前にコレがあったから。

P34
Cでは、すべての関数の引数が”値で”受渡しされるからである。
(略)
Fortranのような”call by reference(参照による呼び出し)”の言語やPascalのvarパラメータとは、Cの性質は違ったものになっている。
 おもな違いは、Cでは、呼ばれた関数が呼んだほうの変数を変えることはできないという点にある。

この直後だったので、そりゃ誰でも勘違いするだろう。不親切な本だ。
同じように悩んだ方に、本記事を見つけてもらえると嬉しい。






……と、ココで一度記事をアップして、K&Rを読み直していたら、P35の一番上にちゃんと書いていた\(^o^)/オワタ

配列の名前が引数として使われるときは、関数に渡される値は、実際には配列の先頭番地すなわちアドレスである。


親切な本だ。
もう寝る。