2017-01-26 14 views
0

Я не понимаю, почему t->next указывает на другой адрес, кроме t. Если указатель t->next равен адресу n, а указатель t равен адресу t->next. Почему t->next похоже указывает на другой адрес? Я застрял здесь.Указатель указывает на адрес, которого я не ожидал

struct Node { 
    int data; 
    Node* next; 
}; 

int main() { 
    Node* n; 
    Node* t; 
    Node* h; 

    n = new Node; 
    t = new Node; 

    n->data = 2; 
    t->next = n; 
    t = t->next; 

    cout << n << "\n" << n->data << "\n" << t << "\n" << t->next << endl; 

} 

Выход:

 
0x7a11c8 
2 
0x7a11c8 
0x65685372 
+1

Вы не инициализировали 'n-> next'. –

ответ

1

Учитывая следующее после t = new Node, каждая из следующих строк производит следующие изменения.

Память выделенная для n & t.

 
n->+-----------+ t->+-----------+ 
    |data = ? |  |data = ? | 
    |next = ? |  |next = ? | 
    +-----------+  +-----------+ 

значение, присвоенное data элемента памяти, на которую ссылается п.

n-data = 2; 
 
n->+-----------+ t->+-----------+ 
    |data = 2 |  |data = ? | 
    |next = ? |  |next = ? | 
    +-----------+  +-----------+ 

значение, присвоенное next элемента памяти, на которую ссылается т.
И это произойдет в случае расположения n.

t->next = n; 
 
n->+-----------+ t->+-----------+ 
    |data = 2 |  |data = ? | 
+->|next = ? |  |next = @n |--+ 
| +-----------+  +-----------+ | 
+-----------------------------------+ 

Значение т перенаправлены ссылаться же, как память t.next (которая в настоящее время n).
Вы должны заметить, что ни в каком пункте вы не установили элемент next из n.

t = t->next; 
 
        vv orphan vv 
n->+-----------+  +-----------+ 
t->|data = 2 |  |data = ? | 
+->|next = ? |  |next = @n |--+ 
| +-----------+  +-----------+ | 
+-----------------------------------+ 

ВНИМАНИЕ Вы также потеряли только ссылаться на расположение памяти, выделенной в t = new Node;. Таким образом, у вас есть утечка памяти.

+0

Возможно, важно понять, что *** old *** 't-> next == n', но, изменив' t', вы действительно имеете изменения 't-> data' и' t-next', а также , –

+0

Я выбрал ваш ответ, чтобы объяснить, что было неправильно визуально и шаг за шагом. Благодаря! – svb

3

Во-первых, вы на самом деле есть t->next == n поэтому они должны указывать на тот же адрес. Однако, далее вы делаете t = t->next, поэтому t указывает теперь на другой узел (тот же узел указал на n, если быть конкретным), а его next неинициализирован, поэтому «случайное» значение находится в конце вашего вывода. Если вы распечатаете только t, вы должны увидеть то же значение, что и первое.

0

Так оно и должно быть. Вы делаете t = t->next - после этого, n == t. Но потом, вы запрашиваете t->next, который не был установлен

код примера:

t->next = n; // t->next == n 
t = t->next; // t == t->next == n 
// calling t->next 
std::cout << t; // t == n 
std::cout << t->next; // the same as n->next or t->next->next for previous state of t 

Так что вы видите: п указывает на то же место, как т делает. t-> next - где-то еще, очевидно.

Кстати, списки легко после того, как вы нарисуете всю картину. Все становится ясно.

0

это базовый элемент связанного списка, класс содержит указатель на другой объект того же класса, поэтому указатель n имеет данные и адрес для следующего объекта, следующий объект также ведет себя так же, как и так далее ...

Node* n; 
Node* t; 

n = new Node; 
n->data = 2; 
n->next = NULL; 

t = new Node; 
t->data = 5; 
t->next = n; // link the nodes 


//t = t->next; // why this it like moving in linked list through nodes 

в настоящее время т имеет данные 5 и его следующий указатель указывает на п, которая имеет данные 2

следующий указатель п указывает на NULL;

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

  • Нет связанных вопросов^_^