Использование двумерного char-массива с функцией - PullRequest
0 голосов
/ 08 декабря 2018

Когда я объявляю или просто пишу функцию, которая принимает двумерный массив char в C, Visual Studio говорит мне, что мне нужно поместить значение в параметр столбцов, например:

void board(char mat[][MAX_COLUMNS]);

поэтому мой вопрос: зачем мне даже указывать C одно измерение двумерного массива и почему это должно быть конкретно число столбцов.

Ответы [ 4 ]

0 голосов
/ 08 декабря 2018

Предположим, у вас есть массив

char arr[3][4];

и определите функцию как

void board(char mat[][4])

Массив распадается на указатель, поэтому, если функция хочет получить доступ к mat[2][1], тогдасмещение от указателя будет строка x ширина + столбец элементов, поэтому 2 * 4 + 1 = 9.Обратите внимание, что массивы всегда являются смежными, независимо от того, сколько измерений.

Но если вы определите функцию как

void board(char mat[][])

, тогда нет информации, кроме указателя, и компилятор понятия не имееткак индексировать массив.

Причина, по которой данное измерение должно быть числом столбцов, заключается в том, что именно так массив располагается в памяти, строка за строкой.

0 голосов
/ 08 декабря 2018

Поскольку массивы не являются объектами первого класса в C. Когда вы передаете массив функции, он распадается на указатель, и вызываемый объект не может угадать размер.Для одномерного массива он все еще позволяет получить доступ к элементам через арифметику указателей.Но для двумерного массива (массива массива) арифметика указателей требует, чтобы размер объекта второго уровня (здесь строка) был известен.Именно поэтому число столбцов должно быть явным.

Кроме того, Microsoft C не поддерживает массив переменной длины, поэтому число столбцов должно быть постоянным.

0 голосов
/ 08 декабря 2018
void board(char mat[][MAX_COLUMNS]);

эквивалентно

void board(char (*mat)[MAX_COLUMNS]);

с char (*mat)[MAX_COLUMNS], являющимся типом, к которому относится ваш 2D-массив, когда передается в board(): к указателю на его 1-й элемент, как это сделано длялюбой массив, переданный в функцию.

0 голосов
/ 08 декабря 2018

Weather Vane указал хорошо.

Плюс, если вы хотите обойти это ограничение, используйте этот прототип:

void board(char *mat, int rows, int columns);

И вы можете получить к нему доступ с помощью этого выражения.

mat[i*columns+j]

когда вы хотите получить доступ к i й строке j элементу столбца.

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...