C++中的双指针数组

Double pointer array in c++

我正在阅读一个关于 BTree 的程序,在那里我遇到了这个:BTreeNode **C。我知道它是一个二维数组,但它被初始化为 C=new BTreeNode *[2*t];。我无法理解:这是一个具有动态行和 2t 列的二维数组吗? 谢谢

语句 C=new BTreeNode *[2*t]; 为类型 BTreeNode *2*t 个实例分配 space,因此 returns 类型 BTreeNode ** 指向第一个此类实例的元素。这是数组的第一维,但是没有为第二维分配内存。

是的。如果数组被索引为列优先顺序(因此 C[3][4] 是第 4 列的第 5 个元素),那么 C 可能有参差不齐的(不同大小的)列。

寻找一些为每一列分配内存的代码,即

C[i] = new BTreeNode[length];

在 i 的循环中,这表明二维数组每列的长度相同。

您可能很清楚 double* 是指向 double 元素的指针。同样,double** 是一个指向 double* 元素的指针,它本身就是一个指针。同样,double*** 是指向 double** 元素的指针,依此类推。

当您将数组实例化为类型 T 时,您通常会这样做 new T [size];。例如,对于 double 的数组,您可以编写 new double[size];。如果你的类型 T 本身是一个指针,它完全一样:你写 new double*[size];,你得到一个指针数组。

在您的例子中,BTreeNode* 是指向 BTreeNode 的指针,而 BTreeNode** 是指向 BTreeNode* 的指针,后者是指向 BTreeNode 的指针。当你通过 new BTreeNode*[size]; 实例化它时,你会得到一个指向 BTreeNode 元素的指针数组。

但实际上,在这一步您没有二维数组,因为新分配的数组中的指针未分配。通常的做法是使用以下示例:

int num_rows = 10;
int num_cols = 20;
BTreeNode** C = new BTreeNode*[num_rows];
for(int i = 0; i < num_rows; i++)
{
  // Then, the type of C[i] is BTreeNode*
  // It's a pointer to an element of type BTreeNode
  // This pointer not allocated yet, you have now to allocate it
  C[i] = new BTreeNode [num_cols];
}

不要忘记在使用后删除你的记忆。通常的做法如下:

for(int i = 0; i < num_rows; i++)
  delete [] C[i];
delete [] C;