配列は必ず連続したメモリ空間を利用して確保されます。
図で表せば、下記のような状態で確保されるのです。
『変数の容量は型によって決定する』ので図のように、同じ型の配列の要素は等間隔に配置されるのです。
仮にint変数のサイズを 1メモリ という単位で扱った場合、
data[0] は 1メモリ目から2メモリ目まで領域を確保しています。
同様に、data[1]は 2メモリ目から3メモリ目までを確保しています。
つまり、『配列の添え字*変数サイズ+変数の開始位置』をすれば データの開始位置は求めることが出来るのです。
この考え方を理解しておくと、今後ポインタを扱っていく上で大きな力となるはずですので、頑張って理解してください。
ちなみに、C言語の配列は、この考え方を利用して、
宣言するとメモリ空間を確保することにはしますが
int data[]; 変数には配列の先頭位置しか記録していないのです。
その為、配列の範囲外にアクセスしても int data[] は配列のサイズなんて覚えていないので
警告することも出来ずに、その不正アクセスを許してしまうのです。
これはバグの元ですので、比較的最近出来た言語(JAVA や C#など)は配列の長さなどの付加情報も記録し、
これらの不正アクセスを阻止する仕組みが言語自体に備わっているものが多いです。