Поскольку я вижу, что никто не отвечает на настоящий вопрос, здесь я задаю мой.
В C99 у вас есть массивы переменной длины (VLA), которые объявляются с длиной, которая оценивается во время выполнения, а не только во время компиляции, как в предыдущих версиях C. Но передача массивов в функции немного сложна.
Одномерный массив всегда просто передается как указатель, поэтому
void sort(size_t n, int arr[n]) {
}
эквивалентно
void sort(size_t n, int *arr){
}
Более высокие измерения хорошо переданы функции
void toto(size_t n, size_t m, int arr[n][m]){
}
эквивалентно
void toto(size_t n, size_t m, int (*arr)[m]){
}
При таком определении внутри такой функции вы можете получить доступ к элементам с выражениями, такими как arr[i][j]
, и компилятор знает, как вычислить правильный элемент.
Теперь приходит синтаксис, который вы обнаружили, который полезен только для прототипов , то есть мест, где вы заранее объявляете интерфейс функции
void toto(size_t, size_t, int arr[*][*]);
поэтому здесь вы можете заменить размер массива на *
в качестве заполнителей. Но это полезно только тогда, когда у вас нет названий размеров под рукой, и гораздо понятнее использовать точно такую же версию, что и для определения.
void toto(size_t n, size_t m, int arr[n][m]);
Как правило, для последовательного использования важно, чтобы в списке параметров сначала были размеры. В противном случае они не будут известны, когда компилятор анализирует объявление arr
.