配列

配列を利用するとインデックスを使って連続したデータにアクセスすることも可能になります・・・

と、ひとことでいうとそういうことですが、 他のプログラミング言語をご存知の方なら、配列というのがどんなものか知っているとおもいますが、初めての方にはちょっと分かりにくいかもです。

普通の変数は、a は 10, b は 20・・・、というように、変数に対してひとつずつ値が割り振られます。 配列の場合はひとつの変数(例えば a) を使って、a の 1 番は 10, a の 2 番は 20、a の 3 番は 30、・・・ というように値を割り振ることができます。

C 言語では a の 1 番は a[1] のように、[ ] を使って表現します。

この時の [] の中の値が、添字、とか、インデックスと呼ばれます。そして、添字を使って利用できるデータひとつひとつを配列の「要素」という言い方をします。

ちなみに、C 言語の場合はインデックスは 0 番からはじまりますので、本当の意味で a の 1番目は a[0] なのですが、 ちょっとややこしいので、とりあえず1番は a[1] だ、と書きました。なんで、こんな風に 1 番目が添字 0 なのか、というのには実はちゃんとした理由があります。

添字が0から始まる理由

プログラム上で配列を確保した、ということは、裏ではメモリ上で連続したメモリ領域を確保した、ということになります。

例えば、int のサイズが 4 バイトの処理系で、 3 要素をもつ int の配列を確保したとします。すると、配列として使える領域は (要素数) かける (要素毎のサイズ) ということで、 3 かける 4 = 12 バイトのメモリ領域が割り当てられます。

そして、そのメモリ領域が 1000番地から始まるとすると、1個目の要素が 1000 番地からの4バイト、2 個目が 1004 番地からの4バイト、3 個目が 1008 番地からの4バイトを使います。

すなわち・・・
1 個目の要素のアドレスは (配列の先頭アドレスからオフセットなし。あえていえば int 0 個分のオフセット)
2 個目の要素のアドレスは (配列の先頭アドレスからオフセットが int 1個分)
3 個目の要素のアドレスは (配列の先頭アドレスからオフセットが int 2個分)
となります。

実は配列の型や添字というのは、その先頭アドレスからのオフセットを決めるものといえるのです。

つまり int 型 (=1要素4バイト) の配列で a[2] ということは、上でみたように「a の先頭アドレスから 8 バイト先のアドレスの値」といえます。

1個目の要素は先頭アドレスそのものに存在するので、オフセットはゼロ。すなわち添字 0、ということになるのです。

うまく説明できているといいのですが・・・おわかりになりましたでしょうか?

実際にプログラムを動かして確認した様子はこちらです » 配列の要素の場所をみてみよう!