指针指向一个我没想到的地址
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;
中分配的内存位置的唯一引用。所以你有内存泄漏。
我不明白为什么 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;
中分配的内存位置的唯一引用。所以你有内存泄漏。