2013-08-11 2 views
0

Я создаю небольшой класс дерева AVL в C++, и я немного перепутал с указателями здесь, и его действие довольно странно.Почему мои указатели на C++ внезапно расходятся?

В классе У меня есть переменная с именем «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; 
} 

(Обратите внимание, что «левый» является полем, которое содержит указатель на узел).

Теперь первая печать всегда печатает одну и ту же ячейку памяти.

Однако второй вызов будет печатать другой каталог для этого -> root и * node.

Почему это? Когда я устанавливаю «* node = (* node) -> left;», не следует ли это изменять этот-> корень, так как узел - это просто указатель на этот указатель?

Я немного растерялся.

Любая помощь приветствуется!

EDIT: Выходной образец следующим образом:

0x902a88

0x902a88

0x902a88

0x902aa8

РЕДАКТИРОВАТЬ 2: Распечатка & this-> root и node вместо этого показывают, что они всегда имеют одинаковое значение, поэтому он выглядит так, что указатель указывает на нужное место.

+0

Как вы называете эту функцию? – Inspired

+0

Буквально только это-> RRotate (node) (где узел задан как указатель на корень) – Cisplatin

+0

Почему вы используете Node **? Предположительно, чтобы мутировать указатель. Таким образом, я бы ожидал, что вы назовете это как> RRotate (& node). – seanmcl

ответ

2

Чтобы узнать телефон, то, что бы вы хотели сделать RRotate(&root), чтобы указатель мыши на this->root.

Или подробнее:

Скорее всего, в вашем коде node просто не указывает на root поле. Попробуйте распечатать node и &root.

+0

Проверено, но они одинаковы (см. Редактировать 2) – Cisplatin

+1

Я согласен с Inspired. Этот фрагмент отлично работает: https: //gist.github.com/Pikrass/2a5cc95d59eea3f161df – Pikrass

+1

Если у вас есть два указателя с одинаковым адресом, они ** должны ** указывать на то же значение. Если у вас нет неопределенного поведения где-нибудь (например, «root» не инициализирован или объект уничтожен). – Inspired

Смежные вопросы