1. ホーム
  2. c++

[解決済み] c++のダブルポインタ配列

2022-03-16 20:07:32

質問

BTreeに関するプログラムを読んでいて、こんなことに出くわしました。 BTreeNode **C . 2次元の配列であることは理解できますが、初期化されるのは C=new BTreeNode *[2*t]; . これは動的な行と2t列を持つ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 要素で構成されます。

しかし、実はこの段階では、2次元配列はできていません。なぜなら、割り当てられたばかりの配列のポインタは、割り当てられていないからです。通常のやり方は、次の例のようになります.

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;