0

私は C++ で小さな AVL ツリー クラスを作成していますが、ここでポインターと少し混同されており、かなり奇妙な動作をしています。

クラスには、 node へのポインターである「root」という名前の変数があります。ある時点で、このオブジェクトのポインターを次の関数に渡します。

template <class T> void AVL<T>::RRotate(Node ** node) {
    std::cout << this->root << std::endl << *node << std::endl;
    *node = (*node)->left;      
    std::cout << this->root << std::endl << *node;
}

(「左」はノードへのポインタを含むフィールドであることに注意してください)。

これで、最初の印刷では常に同じメモリ位置が印刷されます。

ただし、2 番目の呼び出しでは、this->root と *node の別のディレクトリが出力されます。

どうしてこれなの?「*node = (*node)->left;」を設定すると、node は単にそのポインターへのポインターであるため、this->root も変更するべきではありませんか?

私は少し混乱しています。

どんな助けでも大歓迎です!

編集:サンプル出力は次のとおりです。

0x902a88

0x902a88

0x902a88

0x902aa8

編集 2: &this->root と node を出力すると、それらが常に同じ値であることが明らかになるため、ポインターが正しい場所を指しているように見えます。

4

1 に答える 1

2

へのポインターにRRotate(&root)なりたい場合は、を呼び出す必要があります。nodethis->root

または、より詳細:

node = &(this->root);
this->RRotate(node);

ほとんどの場合、コードではフィールドnodeを指していません。root印刷nodeしてみてください&root

于 2013-08-11T21:59:36.520 に答える