引数で受け取った配列は実は配列ではない
実はC言語には「参照渡し」は存在しないって聞いたので、色々試してたら、どうも配列を関数に渡す場合は実は配列は渡されていなかったことに気付いて衝撃を受けたので、その話。
$ gcc argument_array.c
$ ./a.out
a = 0x0x7fff56cc0a80 sizeof(a) = 40
b = 0x0x7fff56cc0a80 sizeof(b) = 8
c = 0x0x7fff56cc0a80 sizeof(c) = 8
d = 0x0x7fff56cc0a80 sizeof(d) = 8
実はどの書き方でもint *型で配列の先頭アドレスが渡されてるんですよね。
多次元配列を渡すときに、a[ ][10]はOKだけど、a[ ][ ]みたいな渡し方ができないのも納得です。
本当は GCCの警告文がいっぱい出てくるんですけど、等幅フォントじゃないから消してます(^←の位置がおかしくなる)。フォント変更ってどうやるんだろう。
アドレスが渡されるということは、配列の要素数を取得するのに
sizeof(a)/sizeof(int)
みたいな書き方は実引数には使えないんですね。
ポインタの闇は深い。