Как динамически объявить 2D-массив в C ++ с помощью оператора new

Опубликовано: 30 Ноября, 2021

Предварительное условие: основы работы с массивами
В C / C ++ - многомерные массивы простыми словами как массив массивов. Данные в многомерных массивах хранятся в табличной форме (в порядке возрастания строк). Ниже представлена общая форма объявления N-мерных массивов :

Синтаксис многомерного массива :

data_type array_name[size1][size2]….[sizeN];

data_type: Type of data to be stored in the array. 
Here data_type is valid C/C++ data type
array_name: Name of the array
size1, size2, …, sizeN: Sizes of the dimensions

2D-массивы - это массивы одномерных массивов.

Синтаксис 2D-массива :

data_type array_name[x][y];
data_type: Type of data to be stored. Valid C/C++ data type.

Ниже приведено схематическое изображение 2D-массивов:

Дополнительные сведения о многомерных и 2D-массивах см. В статье «Многомерные массивы» в C ++.

Проблема: учитывая 2D-массив, задача состоит в том, чтобы динамически выделить память для 2D-массива, используя новые возможности C ++.

Решение: объявлен следующий 2D-массив с 3 строками и 4 столбцами со следующими значениями:

 1 2 3 4
5 6 7 8
9 10 11 12

Примечание. Здесь M - количество строк, а N - количество столбцов.

Метод 1: использование одного указателя - в этом методе выделяется блок памяти размером M * N, а затем доступ к блокам памяти осуществляется с помощью арифметики указателя. Ниже представлена программа для того же:

C ++

// C++ program to dynamically allocate
// the memory for 2D array in C++
// using new operator
#include <iostream>
using namespace std;
// Driver Code
int main()
{
// Dimensions of the 2D array
int m = 3, n = 4, c = 0;
// Declare a memory block of
// size m*n
int * arr = new int [m * n];
// Traverse the 2D array
for ( int i = 0; i < m; i++) {
for ( int j = 0; j < n; j++) {
// Assign values to
// the memory block
*(arr + i * n + j) = ++c;
}
}
// Traverse the 2D array
for ( int i = 0; i < m; i++) {
for ( int j = 0; j < n; j++) {
// Print values of the
// memory block
cout << *(arr + i * n + j)
<< " " ;
}
cout << endl;
}
//Delete the array created
delete [] arr;
return 0;
}


Выход:
 1 2 3 4 
5 6 7 8 
9 10 11 12

Метод 2: использование массива указателей: здесь создается массив указателей, а затем на каждый блок памяти. Ниже приведена диаграмма, иллюстрирующая концепцию:

Ниже представлена программа для того же:

C ++

// C++ program to dynamically allocate
// the memory for 3D array in C++
// using new operator
#include <iostream>
using namespace std;
// Driver Code
int main()
{
// Dimensions of the array
int m = 3, n = 4, c = 0;
// Declare memory block of size M
int ** a = new int *[m];
for ( int i = 0; i < m; i++) {
// Declare a memory block
// of size n
a[i] = new int [n];
}
// Traverse the 2D array
for ( int i = 0; i < m; i++) {
for ( int j = 0; j < n; j++) {
// Assign values to the
// memory blocks created
a[i][j] = ++c;
}
}
// Traverse the 2D array
for ( int i = 0; i < m; i++) {
for ( int j = 0; j < n; j++) {
// Print the values of
// memory blocks created
cout << a[i][j] << " " ;
}
cout << endl;
}
//Delete the array created
for ( int i=0;i<m;i++) //To delete the inner arrays
delete [] a[i];
delete [] a; //To delete the outer array
//which contained the pointers
//of all the inner arrays
return 0;
}


Выход:
 1 2 3 4 
5 6 7 8 
9 10 11 12

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .