C++中的双指针数组

Nik*_*rma 0 c c++ arrays allocation

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

Cad*_*hon 8

您可能很清楚这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];
}
Run Code Online (Sandbox Code Playgroud)

使用后不要忘记删除您的内存。通常的方法如下:

for(int i = 0; i < num_rows; i++)
  delete [] C[i];
delete [] C;
Run Code Online (Sandbox Code Playgroud)