15. C/C++ Многомерный массив в динамической памяти

Многомерный массив в динамической памяти

Ранее мы рассмотрели, как создать массив в динамической памяти.

Рассмотрим теперь, как создать двумерный массив в динамической памяти:
Принципиальная идея показана на рисунке – мы создаем массив указателей на одномерные массивы, которые играют роль строк, и перемещаясь по ним получаем доступ к элементу.

В коде это выглядит так (пример на 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;
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *