石破:えー
……まあ、そもそも、C言語の配列とは何か、というところから、ゆっくりお話ししたいと思います。C言語の配列というのはですね……ひとつの変数の中に、同じ型のデータを、連続して並べたものです。
たとえば
int numbers[5];
こう書きますと……5個のint型の箱が、ぴったり隣り合ってメモリ上に並ぶわけです。で、番号は0から始まりますから
numbers[0] が一番目
numbers[1] が二番目
……
numbers[4] が五番目
という感じですね。
(ここ、間違えないように、ちゃんと覚えておいてほしいと思います)
ただ……ここが大事なところなんですが、C言語の配列は、関数に渡した瞬間に「ポインタ」に変わってしまうんです。つまり、配列の名前だけを書いて関数に渡すと、「最初の要素の住所」だけが渡されて、「全体で何個あるか」という情報が、ぱぁっと消えてしまう。
これを「配列の崩壊」と呼ぶんですが……まあ、なかなか厄介な仕様です。だから、C言語には「この配列は何個ありますか?」という便利な関数が、最初から存在しないんです。(ええ、ないんですよ、本当に)
なので、よくやる方法は二つあります。sizeof を使う(ただし、配列の定義されているスコープ内でしか正しく動かない)
int len = sizeof(numbers) / sizeof(numbers[0]);
配列の長さを別に引数で渡してあげる
void func(int arr[], int len) { ... }
……というわけで、C言語の配列というのは、「便利そうに見えて、実はメモリとポインタのことをちゃんと理解していないと、すぐに痛い目を見る」仕組みなんですね。まあ、そういうところも含めて、C言語の味わいだと思っています。
(ネットリ)