Как передать в функцию двумерный массив.

Как передать в функцию двумерный массив.

В одной из статей, написанной несколько лет назад, описывал для чего в си используются указатели и как с ними работать. Сегодня перечитывая, ту статью понял, что есть еще один интересный вопрос, который стоило бы рассмотреть. "Как передать в функцию двумерный массив ?"

Ответ напрашивается сам собой, использовать для этого указатель. Но просто передать адрес первого элемента двумерного массива недостаточно(по сути указатель), давайте разберемся почему.

Несмотря на то, что двумерный массив, по сути представляет собой таблицу(массив элементами которого являются массивы), в памяти все его элементы хранятся последовательно и для того, чтобы в этой последовательности как-то ориентироваться необходимо знать размер его второй мерности. То есть если у нас есть массив arr[5][20], для работы с ним достаточно знать с какого адреса он начинается и что размер его второй мерности равен 20.

Тогда формула для вычисления адреса любого элемента массива будет иметь следующий вид
arr + 20*i + j
arr — адрес начала массива;
i — первый индекс элемента;
j — второй индекс элемента;

Двумерный массив можно использовать для хранения строк, описывающих какую-то сущность. В таком случае функция, модифицирующая его, будет выглядеть следующим образом.
void Update_List_Name(char *arr, uint8_t j)
{
char a;
uint32_t adr;
//первая буква первой строки имеет адрес начала массива
adr = (arr+0*j+0);
//вторая буква первой строки располагается по адресу 
adr = (arr+0*j+1) ;
//вторая буква первой строки располагается по  адресу
adr = (arr+1*j+0) ;
//вторая буква первой строки располагается по адресу 
adr = (arr+1*j+1) 
// для получения данных хранящихся в ячейке,
// необходимо использовать операцию разыменования
a = *adr;
}


Аналогично можно передать указатель, указав размер второй мерности массива
void Update_List_Name(char *arr[20])
{
char a;
//в таком случае обращаться к элементам массива можно как обычно
 a = arr[1][2];
}


Или передать массив, указав размер его второй мерности.
void Update_List_Name(char arr[][20])
{
char a;
//в таком случае обращаться к элементам массива можно как обычно
 a = arr[1][2];
}


Какой способ из вышеприведенных использовать каждый решает сам, когда есть понимание сути, это не имеет большого значения.
комментарии
4