前回の解説で、C言語の配列は先頭のメモリアドレスしか保有しないという話をしました。
これはどういうことか?
実は int data[8]; における data という変数は int* data; と大差ない存在なのです。
たとえば、C言語では下記のようなアクセスも有効です。
-----
int data = 5;
int* pointer = &data;
printf( "%d\n", pointer[0] );
-----
推奨はできないアクセス方法ですが、これでも実行結果は 『5』 となります。
dataは配列として定義していませんが、『配列の先頭の変数へのアクセス』は
『単体の変数へのアクセス』と同じ場所の変数を見に行くことになりますので、動作するのです。
ですので、この状態で pointer[1] とアクセスすると、配列外アクセスと同様の結果が発生してしまうので注意が必要です。