>>449
配列の配列というものと、配列がポインタに成り下がるということを理解していないと混乱する。
もう一度説明しよう。
int data[2][4]; としたとき、dataは「int4個の配列」2個の配列で、
これは(一部の例外を除いて)すぐに先頭要素へのポインタに成り下がる。
繰り返すが、配列dataの要素は「int4個の配列」であるdata[0]とdata[1]の2個で、
それへのポインタの型は「int4個の配列へのポインタ型」(int (*)[4])になる。
ポインタ演算の法則から、data+0は0番目の「int4個の配列」へのポインタで、
data+1は1番目の「int4個の配列」へのポインタになる。

間接参照演算子*は、ポインタの指すオブジェクトへの参照を生み出すもので、
そのオブジェクトの値を取り出すわけではない。
配列へのポインタに*を作用させた結果は配列への参照になる
(だいたい、配列そのものには「値」というものは存在しない)。
だから*(data+y)と書けばそれはdataのy番目の「int4個の配列」そのものを意味する。
そしてこれはdata[y]と書いたのと同じである。これは[]演算子の定義による。

しかしこれもまた配列であるから、すぐにその先頭要素へのポインタ(この場合int *)に成り下がる。
よって*(data+y)+xと書けばそれはdataのy番目の「int4個の配列」のx番目の要素へのポインタで、
*(*(data+y)+x)はdataのy番目の「int4個の配列」のx番目の要素である。
これはdata[y][x]と書いたのと同じである。何度も言うが、これは定義による。
*(data+y)+xが&data[y][x]と等しいのは、1+1が2と等しいのと同じ理由である。

>>453
>>456
違う。data+yは配列へのポインタであって、
時にダブルポインタと呼ばれるところのポインタへのポインタではない。