Когда выражение массива появляется в большинстве контекстов, его тип неявно преобразуется из «N-элементного массива T» в «указатель на T», а его значение устанавливается на адрес первого элемента в массиве. Исключениями из этого правила являются случаи, когда выражение массива является операндом операторов sizeof
или address-of (&
), или если выражение массива является строковым литералом, используемым для инициализации другого массива в объявлении.
В контексте вашего кода это означает, что при вызове box_sort
тип выражения boxes
неявно преобразуется из M-element array of N-element array of int
в pointer to N-element array of int
или int (*)[MAX_DIMENSIONALITY+1]
, поэтому ваша функция должны ожидать типы параметров, такие как:
void box_sort(int (*arr)[MAX_DIMENSIONALITY+1], int x, int y)
{
...
}
Поскольку int *a
и int a[]
являются синонимами в объявлении параметра функции, из этого следует, что int (*a)[N]
является синонимом int a[][N]
, поэтому вы можете написать выше как
void box_sort(int arr[][MAX_DIMENSIONALITY+1], int x, int y)
{
}
хотя я лично предпочитаю обозначение указателя, так как оно более точно отражает происходящее. Обратите внимание, что в вашей функции вы должны добавить arr
как обычно:
arr[x][y] = ...;
, поскольку выражение arr[x]
эквивалентно *(arr + x)
, указатель неявно разыменовывается.
Если вы хотите, чтобы box_sort работал с массивами произвольного размера (т. Е. С массивами, где второе измерение не обязательно MAX_DIMENSIONALITY + 1), то один из подходов заключается в следующем:
int boxes[X][Y];
...
box_sort (&boxes[0], X, Y, x, y);
...
void box_sort(int *arr, size_t rows, size_t cols, int x, int y)
{
...
arr[x*cols + y] = ...;
}
По сути, вы рассматриваете boxes
как 1-й массив int и вычисляете смещения вручную.