こんにちは、皆さん!
皆さんはプログラミングしてて配列をよく使うと思います。でも、使ってて「なぜインデックスが0から始まるのかな?」って疑問に思ったことはないですか?
今回はそんな疑問を解決すべく配列がどのようにコンピュータ内で処理されているのかを分かりやすく図解付きで説明していこうと思います!!


トピック


配列はどのようにコンピュータ内で処理されているのか?

まずは後の話が分かりやすくなるように配列がコンピュータ内でどのように処理されているのかを解説していこうと思います。
配列って言うと下記のように定義して、その要素にアクセスします。

// 配列を定義する
int[] arr = {4, 7, 3};

// 結果:7
System.out.println(arr[1]);

このように配列のカッコ内にインデックスを入れて特定の要素を引き出します。
では、コンピュータ内では何が起こっているのでしょうか?

まず、配列を定義した際に下記のように連続のアドレスにそれぞれ配列の要素が入れられます。コンピュータ内では16進数でアドレスを表現するのが一般的です。

コンピュータ内の配列

そして、上記のようにある要素にアクセスするときは下記のような操作が行われます。

配列の要素にアクセス

このように与えられたインデックスを計算式に入れて、割り出されたアドレスにある要素の値が返ってくるのです。

今回は整数を使っているため、そのサイズが4バイトであるが、文字列のような8バイトのタイプの配列だと下記のようになります。

配列の要素のアクセス(文字列の場合)

なぜインデックスが0から始まるのか?

それでは、基本を押さえたところでなぜインデックスが0から始まるのか見ていきましょう!

もう前の計算式から理解できたものもいると思いますが、そうです、計算式が合うようにするためなのです。
一つ目の要素にアクセスするには0x0000のアドレスを計算式から割り出さなければいけません。そうすると、インデックスを i として、計算式を利用して方程式を立てると、下記のようになります。

0x0000 + 4 x i = 0x0000

これを計算すると、i = 0が求まるので、やはり、インデックスは0ということになります。

でも、もしも、下記のように最初のアドレスに何も保存しないでその次のアドレスから要素を保存すれば、インデックスは1からでもいいよねって思う人が出てきます。

配列を1インデックスにした場合

しかし、これでは配列を定義するごとに一個目のアドレスを無駄遣いすることになります。早くて、様々なタスクを同時にこなすコンピュータにとってこのような無駄遣いは使えるメモリ量を急速に減らしてしまうため命とりです。

以上の理由を持って、プログラミングでは0インデックスで配列を処理するように決めたのです。


まとめ

今回は配列のインデックスが0から始まる理由について見てきました。このようにその理由を理解すると、プログラミングが一段理解しやすくなるし、すごく論理的だなとも思えます。CやC++でプログラミングしている方にとってはメモリの管理もかかわってくるので、より大事な概念ではないかと思います。

また、世の中にはインデックスが1から始まるプログラミング言語も存在します(JuliaやMatlabなど)。なお、それはかなり珍しいケースなので、出くわす人は少ないでしょう。

みなさんの役に立つことを願います!
では、また次回まで✌
記事更新はツイッターで告知するので、ツイッターの方でもフォローお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です