Как динамически объявить 2D-массив в C ++ с помощью оператора new
Предварительное условие: основы работы с массивами
В 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