如何使用新运算符

在 C++中动态声明 2D 数组

原文:https://www . geesforgeks . org/如何使用新运算符动态声明 2d 数组/

先决条件: 数组基础C / C++多维数组简单来说就是一个数组组成的数组。多维数组中的数据以表格形式存储(按行主顺序)。以下是声明 N 维数组的一般形式:

多维数组的语法 :

data _ type array _ name[size 1][size 2]…。[SiZen];

数据类型:要存储在数组中的数据类型。 此处数据类型为有效的 C/C++数据类型 数组 _ 名称:数组名称 尺寸 1、尺寸 2、…、尺寸 N: 尺寸

2D 阵列是一维阵列的阵列。

2D 阵的语法 :

data _ type array _ name[x][y]; 数据类型:要存储的数据类型。有效的 C/C++数据类型。

下面是 2D 阵列的图示:

关于多维和 2D 数组的更多细节,请参考 C++中的多维数组一文。

问题:给定一个 2D 数组,任务是使用 C++ 中的为 2D 数组动态分配内存

解决方案:用 3 行 4 列声明以下 2D 数组,值如下:

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;
}

Output: 

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;
}

Output: 

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