我正在阅读关于BTree的节目,在那里我遇到了这个:BTreeNode **C
。我知道它是一个二维数组,但它被初始化为C=new BTreeNode *[2*t];
。我无法理解这个:这是一个带有动态行和2t列的二维数组吗?
感谢。
答案 0 :(得分:2)
您可能知道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];
}
元素的指针。
但实际上,在此步骤中您没有2D数组,因为未分配新分配数组中的指针。通常的方法是以下示例:
for(int i = 0; i < num_rows; i++)
delete [] C[i];
delete [] C;
使用后别忘了删除内存。通常的做法如下:
mixin
答案 1 :(得分:0)
语句C=new BTreeNode *[2*t];
为类型为2*t
的{{1}}个实例分配空间,因此返回指向此类实例的第一个元素的类型BTreeNode *
。这是数组的第一个维度,但是没有为第二个维度分配内存。
答案 2 :(得分:0)
是。如果数组被索引为列主要顺序(因此C [3] [4]是第4列的第5个元素),那么C可能会有不规则(不同大小)的列。
查找为每列分配内存的代码,即
-rw-r--r--. 1 root root 120 abr 10 09:18 /etc/httpd/conf.modules.d/10-subversion.conf
在i上的循环中,表示2D数组的每列长度相同。