Вопрос: Как мне равноправно использовать статически и динамически задаваемые многомерные массивы при передаче их в качестве параметров функциям?

Ответ:
Идеального решения не существует. Возьмем объявления
int array[NROWS][NCOLUMNS];
int **array1;
int **array2;
int *array3;
int (*array4)[NCOLUMNS];

соответствующие способам выделения памяти в вопросах 2.10
Автор: Кодт
Дата: 20.01.03
и 2.14
Автор: Кодт
Дата: 20.01.03
, и функции, объявленные как
f1(int a[][NCOLUMNS], int m, int n);
f2(int *aryp, int nrows, int ncolumns);
f3(int **pp, int m, int n);

(см. вопросы 2.10
Автор: Кодт
Дата: 20.01.03
и 2.11
Автор: Кодт
Дата: 20.01.03
). Тогда следующие вызовы должны работать так, как ожидается
f1(array, NROWS, NCOLUMNS);
f1(array4, nrows, NCOLUMNS);
f2(&array[0][0], NROWS, NCOLUMNS);
f2(*array2, nrows, ncolumns);
f2(array3, nrows, ncolumns);
f2(*array4, nrows, NCOLUMNS);
f3(array1, nrows, ncolumns);
f3(array2, nrows, ncolumns);

Следующие два вызова, возможно, будут работать, но они включают сомнительные приведения типов, и работают лишь в том случае, когда динамически задаваемое число столбцов ncolumns совпадает с NCOLUMS:
f1((int (*)[NCOLUMNS])(*array2), nrows, ncolumns);
f1((int (*)[NCOLUMNS])array3, nrows, ncolumns);

Необходимо еще раз отметить, что передача &array[0][0] функции f2 не совсем соответствует стандарту; см. вопрос 2.11
Автор: Кодт
Дата: 20.01.03
.

Если Вы способны понять, почему все вышеперечисленные вызовы работают и написаны именно так, а не иначе, и если Вы понимаете, почему сочетания, не попавшие в список, работать не будут, то у Вас очень хорошее понимание массивов и указателей (и нескольких других областей) C.
Автор: Кодт    Оценить