一つずつ名前を付ける代わりに番号で指定する

気温を30日分記録するとき、temperature1temperature2というように別々の変数を用意すると、データが増えるたびに変数名も処理も増えてしまいます。配列なら、全体に一つの名前を付け、各要素を位置を示す番号で区別できます。この番号を「添字」または「インデックス」といいます。

例えば、点数を scores = [72, 85, 68, 90] と表す場合、scores が配列全体の名前、四つの数値が要素です。多くのプログラミング言語では先頭の添字を0とするので、scores[0] は72、scores[3] は90を表します。ただし、添字を1から始める言語もあり、書き方も言語によって異なります。大切なのは、要素の値と、その値が置かれた位置を分けて考えることです。

配列には要素の個数、つまり長さがあります。長さが4で添字が0から始まるなら、有効な添字は0から3までです。4を指定すると配列の外を参照することになります。言語によってはエラーになり、別の言語では意図しない動作の原因になります。添字の範囲を確かめることは、配列を安全に扱う基本です。

配列と繰り返し処理が相性のよい理由

位置を番号で表せると、その番号を順番に変えながら、すべての要素へ同じ処理を適用できます。合計を求めるなら、最初は合計を0にして、先頭から末尾までの値を一つずつ加えます。合計を要素数で割れば平均を求められます。データが4個でも400個でも、処理の考え方は変わりません。

このように、配列は手順を明確に記述するアルゴリズムの材料になります。条件に合う要素を数える、最大値を見つける、各要素を2倍する、といった処理も、要素を順に調べる形で表せます。繰り返しの途中で「現在の要素」と「現在の添字」のどちらが必要なのかを意識すると、処理を整理しやすくなります。

配列の順序には意味があるため、要素を入れ替えれば結果も変わる場合があります。小さい順に並べる整列アルゴリズムや、目的の値を探す探索アルゴリズムでは、配列の位置と順序を利用します。特に、値が並び替え済みかどうかは、選べる探索方法に影響します。

一次元の列から表のような二次元配列へ

一列に並ぶ配列は一次元配列と呼ばれます。一方、行と列を持つ表のようなデータは、配列の中に配列を入れる形で表せます。これを二次元配列として扱うことがあります。画像の各画素、座席表、盤面など、縦横の位置が意味を持つデータに向いています。

二次元配列の要素を指定するときは、行と列に対応する二つの添字を使います。例えば「上から2行目、左から3列目」のような位置を、添字の組で示します。ここでも添字が0始まりなら、人が数える「2行目」とプログラム上の添字1が対応します。行と列の順序を取り違えると別の要素を参照するため、配列を作るときに並べ方を決めておく必要があります。

固定長の配列と伸び縮みする入れ物は同じとは限らない

伝統的な配列は、同じ型・同じ大きさの要素を、メモリ上の連続した領域に並べる構造です。先頭の位置と添字から目的の要素の場所を計算できるため、何番目かが分かっていれば直接アクセスできます。その一方で、途中への挿入や削除では、後ろの多数の要素を移動する必要が生じることがあります。

プログラミング言語によっては、宣言した後に長さを変えられない固定長配列を使います。別の言語では、要素を後から追加・削除できる仕組みも「配列」と呼ばれます。このような仕組みは、内部に確保した領域が足りなくなると、より広い領域を用意して要素を移すなどして、伸び縮みするように見せることがあります。

また、文字列などのキーで値を取り出す連想配列は、整数の添字で位置を指定する通常の配列とは異なるデータ構造です。「順番に並んだ値を扱う」「名前と値を対応付ける」など、目的によって適した入れ物は変わります。単に複数の値をまとめられるかだけでなく、検索、挿入、削除、順序のどれを重視するかで選ぶことが重要です。

先頭が「0番目」なのは位置ではなく距離で考えるから

0始まりの添字は、先頭から何個分ずれた場所かという「ずれ」を表すと理解できます。先頭の要素は先頭位置から0個分、次の要素は1個分ずれています。要素の大きさが一定なら、目的の位置は「先頭の位置+要素の大きさ×添字」という形で計算できます。添字0が先頭を自然に表すのはこのためです。

ただし、配列は必ず0始まりという意味ではありません。利用する言語や仕組みの規則が優先されます。0始まりの配列で最後の添字が「長さ−1」になること、ある範囲を先頭から末尾の直前までとして表すと範囲の長さを差で計算しやすいことは、コードを読むときに役立つ周辺知識です。人が使う「1番目」と、プログラムが使う「添字0」を混同しないことが、範囲外参照や一つずれる誤りを防ぐ第一歩になります。