Cómo declarar una array 2D dinámicamente en C++ usando un nuevo operador

Prerrequisito: Array Basics
En C / C++ , arreglos multidimensionales en palabras simples como un arreglo de arreglos. Los datos en arrays multidimensionales se almacenan en forma tabular (en orden de fila principal). A continuación se muestra la forma general de declarar arrays N-dimensionales :

Sintaxis de una array multidimensional :

tipo_datos nombre_array[tamaño1][tamaño2]….[tamañoN];

data_type: tipo de datos que se almacenarán en la array. 
Aquí data_type es válido C/C++ tipo de datos
array_name: Nombre de la array
size1, size2, …, sizeN: Tamaños de las dimensiones

Los arreglos 2D son arreglos de arreglos unidimensionales.

Sintaxis de una array 2D :

tipo_datos nombre_arreglo[x][y];
data_type: Tipo de dato a almacenar. Tipo de datos C/C++ válido.

A continuación se muestra la representación esquemática de arrays 2D:

Para obtener más detalles sobre arrays multidimensionales y 2D, consulte el artículo Arreglos multidimensionales en C++ .

Problema: dada una array 2D, la tarea es asignar memoria dinámicamente para una array 2D usando new en C++ .

Solución: La siguiente array 2D se declara con 3 filas y 4 columnas con los siguientes valores:

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

Nota: Aquí M es el número de filas y N es el número de columnas.

Método 1: usar un solo puntero : en este método, se asigna un bloque de memoria de tamaño M*N y luego se accede a los bloques de memoria usando aritmética de punteros . A continuación se muestra el programa para el mismo:

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;
}
Producción: 

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

 

Método 2: usar una array de punteros : aquí se crea una array de punteros y luego a cada bloque de memoria. A continuación se muestra el diagrama para ilustrar el concepto:

A continuación se muestra el programa para el mismo:

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;
}
Producción: 

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

 

Publicación traducida automáticamente

Artículo escrito por shahbazalam75508 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *