c中的双指针数组

新手上路,请多包涵

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

原文由 Nikhil Verma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 357
2 个回答

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

当您将数组实例 T 类型时,通常会执行 new T [size]; 。例如,对于 double 的数组,您编写 new double[size]; 。如果您的类型 T 本身就是一个指针,那么它完全一样:您编写 new double*[size]; ,然后您会得到一个指针数组。

In your case, BTreeNode* is a pointer to BTreeNode , and BTreeNode** is a pointer to BTreeNode* which is a pointer to 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;

原文由 Caduchon 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

C[i] = new BTreeNode[length];

在 i 上的循环中,这将表明 2D 数组每列的长度相同。

原文由 Ben Braun 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题