Почему мы можем опустить первое измерение многомерного массива, когда мы передаем его функции

Почему мы можем опустить первое измерение многомерного массива, когда мы передаем его функции?

В моем классе программирования нам сказали, что при передаче многомерного массива в функцию мы можем опустить первую меру, например, a[10][15][20] можно передать как a[][15][20].

Почему?

Ответ 1

Поскольку массив будет распадаться на указатель и вычислять смещение к элементам массива, вам не нужно знать самое внутреннее измерение. Смещение до a[i][j][k] равно i*nj*nk+j*nk+k (где nj и nk - соответствующие размеры).

Ответ 2

Вы не можете передавать массивы в функции. Любая функция, объявленная как тип массива, автоматически настраивается для получения соответствующего типа указателя. Когда вы используете имя массива в выражении вызова функции, оно распадается на указатель на его первый элемент.

Эти четыре объявления объявляют одну и ту же функцию:

void f(int b[10][15][20]);
void f(int (*b)[15][20]);
void f(int b[][15][20]);
void f(int b[100][15][20]);

и, учитывая int a[10][15][20];, эти вызовы функций идентичны:

f(a);
f(&a[0]);