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

Why do we use double pointers to reference a 2D array allocated on the heap?

本文关键字:分配 数组 2D 引用 我们 指针 为什么      更新时间:2023-10-16

所以讲座示例有以下代码

 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. 我知道在堆栈上分配的数组,使用变量作为堆栈大小是非法的

    CIN>> n;

    int a[n];

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

  3. 为什么它是指向此数组的双指针?通常对于一维数组,我们使用单个指针作为 int *a = new int[10]?如果我想要数组元素本身的值,我是否像 **a 一样尊重两次?还是我还做*a?

  4. 假设我有一个 2D 对象数组的某个类。我将如何访问第 ith, j 元素的成员字段 var?如果我想在 ith, j 元素中调用对象的成员函数怎么办?

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

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

  3. 您需要双指针,因为 a 是指向整数的指针。 它指向一个数组数组,每个数组在访问值时都需要取消引用。 您通常会使用 a[i][j] 来访问特定元素,这实际上是双重参照。

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

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;