Первое, что нужно сделать, это правильно подобрать типы. Если правила C ++ такие же, как и C, в отношении типов массивов (я почти уверен, что они есть), тогда с учетом объявления
int a[4][4];
выражение a
имеет тип int [4][4]
, который неявно преобразуется ("распадается") в тип указателя int (*)[4]
(указатель на массив из 4 элементов типа int) при передаче в print
, поэтому вы нужно изменить print
на
void print(int (*arr)[4], int s1, int s2)
{
int i, j;
for(i = 0; i<s1; i++)
for(j = 0; j<s2; j++)
printf("%d, ", arr[i][j]);
}
Выражение arr[i]
неявно разыменовывается arr
, поэтому вам не нужно возиться с явным разыменованием.
Недостатком является то, что print
может обрабатывать только массивы Nx4 типа int; если вы хотите обрабатывать массивы других размеров, вам нужно использовать другой подход.
Одна вещь, которую вы можете сделать, это вместо передачи массива, передачи адреса первого элемента и print
вручную вычислить смещения, например:
int main() {
int a[4][4] = {{0}};
print(&a[0][0],4,4); // note how a is being passed
}
void print(int *arr, int s1, int s2) // note that arr is a simple int *
{
int i, j;
for (i = 0; i < s1; i++)
for (j = 0; j < s2; j++)
printf("%d, ", arr[i * s2 + j]);
}