Это своего рода мета-ответ, нацеленный как на Юстикулу, так и на оригинальный постер.
Массивы вырождаются в указатели, но это не одно и то же. Просто потому, что синтаксис для получения [3] [7] [1] одинаков, если a является указателем на указатель на указатель на int по сравнению с массивом-массивом-массивом-массивом -int не означает, что фактическая операция одинакова.
Вы можете создать массив любого типа (четко определенного размера). Синтаксис разыменования массива и синтаксис указателя совпадают, так что
a[i] == *(a+i) == i[a]
независимо от типа массива a.
Все ответы на вопросы в этой теме могут быть получены из этого.
int a[3][2][17]; //a is an array of length 17.
int (*b)[3][2] = a[5]; //b is a pointer to the fifth element of a
int (*c)[3] = b[1]; //c points to the first element of b.
b += 1; // b now points to the sixth element of a. (c is unchanged)
c += sizeof(*b); // c points to the first element of b again.
Обратите внимание, что ничего из этого не сработало бы, если бы a не было смежным. Если это не сработает, то массивы массивов будут работать иначе, чем массивы чего-либо еще.