为什么我们使用双指针来引用堆上分配的2D数组?

时间:2014-11-13 00:27:53

标签: c++ arrays pointers multidimensional-array

所以讲座示例包含以下代码

 int **a;
 a = new int*[10];
 for (int i = 0; i < 10; ++i){
      a[i] = new int[5];
      for (int j = 0; j < 5; ++j){
           a[i][j] = i*10+5;
      }
 }

我对上面的代码(以及堆上的多维数组)有一些问题:

  1. 我们 来初始化数组中的每个元素,如图所示?或者在a [i] = new int [5]?
  2. 之后剪切代码就足够了
  3. 我知道在堆栈上分配的数组,使用变量作为堆栈大小是非法的

    cin&gt;&gt; N;

    int a [n];

    但对于堆分配的数组是否合法?如,a = new int [n]?

  4. 为什么它是指向这个数组的双指针?通常对于1D数组,我们使用单个指针作为int * a = new int [10]?如果我想要数组元素本身的值,我是否需要两次作为** a?或者我还做*?

  5. 所以说我有一些Class的2D数组。我如何访问第i个,第j个元素的成员字段var?如果我想在第i个,第j个元素中调用对象的成员函数怎么办?

2 个答案:

答案 0 :(得分:2)

  1. 您没有 来初始化阵列中的每个元素。如果你不这样做,那么数组的内容将是未定义的。或者,您可以使用new int[5]()进行零初始化。

  2. a = new int[n]在堆上工作,因为它实际上是一个运行时调用,用于标记新内存以供a指向的数据使用。它无法在堆栈上工作,因为编译器需要知道任何特定函数调用的堆栈帧有多大,因此该值必须在编译时可计算。

  3. 您需要一个双指针,因为a是指向指向整数的指针。它指向一个数组数组,每个数组在访问该值时都需要取消引用。您通常会使用[i] [j]来访问特定元素,这有效地进行了双重推理。

答案 1 :(得分:1)

如果在编译时已知矩阵中的列数,则可以只分配一个矩阵:

int nrow = 10;                        // number of rows assigned at run time
int (*a)[5];                          // pointer to array of 5 ints
    a = new int[nrow][5];             // allocate matrix
    for (int i = 0; i < nrow; ++i)    // initialize matrix
        for (int j = 0; j < 5; ++j)
            a[i][j] = i*nrow+j;
    // ...
    delete[] a;