指针指向一个我没想到的地址

Pointer points to an address I didn't expect

我不明白为什么 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

首先,您确实有 t->next == n,所以它们应该指向同一个地址。但是,您进一步执行 t = t->next,因此 t 现在指向不同的节点(具体而言,与 n 指向的节点相同)并且其 next 未初始化,因此 "random" 值在输出的末尾。如果你只打印 t 你应该看到与第一个相同的值。

这是应该的。 你做 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

所以你看到的是:n 和 t 指向同一个地方。 t->next - 显然在别的地方。

顺便说一句,在你画完整个图之后,列表就很容易了。一切都清楚了

这是链表的基础,一个class包含指向同一个对象的另一个对象的指针class所以指针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

现在 t 有数据 5,它的 next 指针指向有数据 2 的 n

n的下一个指针指向NULL;

t = new Node 之后给定以下每一行进行以下更改。

为 n & t 分配的内存。

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

分配给 n 引用的 data 内存元素的值。

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

分配给 t 引用的 next 内存元素的值。
这恰好是 n.

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

t 的值重定向到引用与 t.next 相同的内存(当前为 n)。
您应该观察到您在任何时候都没有设置 n.

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

WARNING 您还失去了对 t = new Node; 中分配的内存位置的唯一引用。所以你有内存泄漏。