Существует два способа передачи двумерного массива в качестве аргумента функции.
char *input (char [][m]arr, int n, int m)
Вы будете читать / записывать значения так, как вы делаете это в своем коде. Помните, что эта функция введена в C99
и не будет компилироваться со старыми компиляторами.
Другой вариант - передать его как указатель:
char *input (char *arr, int n, int m)
Здесь вы могли бы прочитать или написать массив следующим образом:
int i, j;
for(i=0; i<N; i++){
for(j=0; j<M; j++){
*(arr + i * n + j) = 'a';
/* OR you can also do this */
arr[i *n + j] = 'a';
}
}
Многомерные массивы в C хранятся в памяти построчно. Таким образом, если вы выделите массив 3 x 2, у вас будет 3 строки, каждая из которых имеет 2 столбца. Но расположение памяти будет:
0, 1 => row1
2, 3 => row2
4, 5 => row3
Здесь 0,1,2,3,4,5 - смежные индексы массива. Чтобы получить доступ ко 2-му столбцу 3-й строки с указателем arr
на базовый адрес массива, вам нужно будет найти адрес правильной ячейки в массиве.
Мы знаем, что в каждой строке 2 ячейки, поэтому, чтобы перейти к 3-й строке, нам нужно добавить row_id * number_of_cols_per_row
к базовому указателю. Итак, чтобы попасть в 3-й ряд, нам нужно сделать arr + 2 * 2
. Как только мы окажемся в правильной строке, нам нужно добавить смещение столбца столбца, к которому мы хотим получить доступ. Итак, здесь мы хотим получить доступ ко второму столбцу, поэтому мы добавляем 1.
arr + 2 * 2 + 1
Но это будет адрес второго столбца третьего ряда. Чтобы написать здесь, нам нужно использовать оператор *
:
*(arr + 2 * 2 + 1) = 'a';
Это именно то, что мы делаем в цикле.
Кроме того, в вашем коде вы вызываете scanf
со спецификатором формата %d
, который предназначен для целых чисел. Но вы сохраняете значение в массиве char. Это может быть потенциальной ошибкой, правильно использовать спецификатор %c
.