Многомерный массив в динамической памяти
Ранее мы рассмотрели, как создать массив в динамической памяти.
Рассмотрим теперь, как создать двумерный массив в динамической памяти:
Принципиальная идея показана на рисунке – мы создаем массив указателей на одномерные массивы, которые играют роль строк, и перемещаясь по ним получаем доступ к элементу.
В коде это выглядит так (пример на C++):
int ** m = new int * [5]; //создаем массив из указателей
for ( size_t i = 0; i != 5; ++ i ) m [ i ] = new int [5]; //создаем одномерные массивы и присваиваем их адреса в указатель
Обрамим это в функции:
int ** create_array2d ( size_t a , size_t b ) //создание массива
{
int ** m = new int *[ a ];
for ( size_t i = 0; i != a ; ++ i ) m [ i ] = new int[ b ];
return m ;
}
void free_array2d (int ** m , size_t a , size_t b ) //удаление массива
{
for ( size_t i = 0; i != a ; ++ i ) delete [] m [ i ];
delete [] m ;
m=nullptr;
}
Минусом данного способа создания двумерного массива является множественный вызов операторов new и delete[], чтобы это обойти можно сразу выделить в памяти большой массив, и потом изменить указатели.
Эффективная схема создания двумерного массива
int ** Arr2d = new int * [5]; //создаем массив на 5 указателей
Arr2d [0] = new int [5 * 5]; //создаем 1 большой массив и помещаем указатель на него в 0 элемент
for ( size_t i = 1; i != 5; ++ i ) Arr2d [ i ] = Arr2d [ i - 1] + 5; //формируем указатели
Теперь создание и высвобождение можно описать как:
int ** create_array2d ( size_t a , size_t b ) //создание массива
{
int ** Arr2d = new int *[ a ];
Arr2d [0] = new int[ a * b ];
for ( size_t i = 1; i != a ; ++ i ) Arr2d [ i ] = Arr2d [ i - 1] + b ;
return Arr2d;
}
void free_array2d (int ** m , size_t a , size_t b ) //удаление массива
{
delete []Arr2d [0]; //удаляем большой массив
delete []Arr2d; //удаляем массив указателей
m=nullptr;
}

