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;
我正在阅读一个关于 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;