はじめに
今回は、プログラミングをする上でどの言語でも使用する配列というデータ構造が実際どういうものなのかを紹介してきたいと思います。
配列とは
配列はよく以下のような形で見られます。
int numbers[3] = {3, 5, 1};
上記は、数値の配列ですが何を表しているのでしょうか?
これは、連続したメモリ領域に3つの数値データを持たせておくということを表しています。
配列の条件
- 配列には同じデータ型のデータしか入れられない
- 指定した配列の長さを超えるインデックスを指定してデータが入れられない
上記の条件があります。
これは、以下の問題が発生するからです。
問題
- データ型によって、使用するバイト数が違うためデータを取得できない
[3, "ああ", true]
このような配列になった場合、データ型が決まっていないため何バイトを先頭から指定したら3
が取得できるか判断できません。
- 連続して最初に固定値のメモリ領域を確保するため、続きのメモリが空いてるとは限らない
例えば、最初の例でint型の長さ3の配列を作成しました。このときメモリ上では3つの数値データが入る分の領域を確保しています。インデックス4にデータを入れようとすると、確保していない部分のメモリを使うことになります。この領域が他の用途で使用されていた場合、データを保存できません。
疑問
Q. jsやPHPでは、違うデータ型のデータを配列に入れる事ができてしまうのはなぜ?
A. これは、配列内のデータの中で一番多いバイト数のデータに全データ合わせるからです。
[3, "あああ", 4]
の例で説明すると、3
が2バイト、"あああ"
が3バイト、4
が2バイトです。
これだと"あああ"
の3バイト分の領域に合わせて他のデータも確保します。
つまり、2 + 3 + 2の7バイト分ではなく、3 + 3 + 3の9バイト分のデータを確保し、3倍と読み取ればデータを正しく読み取れる状況を作っているのです。
まとめ
配列についてコンピュータサイエンスの視点から解説しました。よく発生するエラーの原因が少しでも理解いただければ幸いです。
私は大学でコンピュータサイエンスを学んでいないため、誤りがあるかもしれません。ご指摘いただけると幸いです。
ここまで読んでくださり、ありがとうございました。