C++ 链表迭代成员访问运算符
c++ linked list iteration member access operator
Node<T> *ptr = Head;
while (ptr)
{
T n = ptr -> data;
ptr = ptr -> next;
}
ptr = current index pointer,
next = linked list pointers,
data = node data.
我知道它是在遍历链表的指针和值。但我不明白的是,这些是如何工作的:
ptr -> data;
ptr -> next;
如果有人能一步一步地告诉我如何计算这些表达式,那就太好了。
编辑::
如何:
head->next;
被评估为地址 2200。我不明白 (*head).next 在没有被 head 指向时如何 = 2200。除非 data 和 next 共享相同的地址?我很确定这是假的。
ptr -> data
等同于 (*ptr).data
对于像Node<T> *ptr
这样的普通指针,->
运算符相当于解引用指针然后访问一个成员。因此,您的示例等同于:
(*ptr).data;
(*ptr).next;
换句话说,表达式计算对象 指向 的成员 ptr
。
ANode
主要成员有:
1 - 指向另一个节点的指针。 (ptr
,在你的例子中)
2 - 它保存的数据值。 (data
,在你的例子中)
Head
代表列表中的第一个节点。
所以,
Node<T> *ptr = Head; // ptr points the ftrst node in the list.
while (ptr) // the last node points nowhere (NULL), so if ptr is NULL we hit the end of the list.
{
T n = ptr -> data; // This no need explanation.
ptr = ptr -> next; // now we want to ptr point to the node is pointing its `next` pointer.
}
这是指针 ptr
在列表中前进的方式:
更多问题
为什么我们必须解引用指针才能访问下一个指针甚至数据本身?
你不必。
ptr->data; // data is a member in a struct/class POINTED by ptr.
*ptr; // this is the class/struct INSTANCE (dereferenced). So
*ptr.data; // data is a member of that instance.
如果你有:
节点a;
节点 *ptr = &a;
// 以下是相同的:
a.next;
ptr->下一个;
*ptr.next;
此外,由于 ptr
将指向数据,您取消引用它以获得数据的实际值。对吗?
不,ptr
永远不会指向数据(根据示例代码)。
ptr->data; // This not means ptr will POINT to data.
// this means "access to the data member of whatever object being POINTED by ptr".
根据给定的代码,ptr实际上会指向链表中的每一个成员?
是的,你明白了!!
ptr->next
如何求值到下一个节点的地址?
指针也是一个变量。一个 int
变量保存 int
个值,一个指针保存 地址.
一个非常简单(且无用)的 Node
会是这样的:
struct Node {
Node *next; // Pointer to another node, yeah but ... which node? In a minute ;)
};
在某些时候,您将不得不编写如下代码:
// Example of adding a node.
Node* Head = new Node;
Node* another_node = new Node;
Head->next = another_node; // This is how Head->next "knows" which node is the next. Because we told him.
所以,现在如果我们用另一个指针指向 Head 的相同地址,假设 ptr
...
Node *ptr = Head;
然后我们可以通过 ptr->next
访问 Head
的 next 成员。当然,这会计算出 another_node
.
的地址
Node<T> *ptr = Head;
while (ptr)
{
T n = ptr -> data;
ptr = ptr -> next;
}
ptr = current index pointer,
next = linked list pointers,
data = node data.
我知道它是在遍历链表的指针和值。但我不明白的是,这些是如何工作的:
ptr -> data;
ptr -> next;
如果有人能一步一步地告诉我如何计算这些表达式,那就太好了。
编辑::
如何:
head->next;
被评估为地址 2200。我不明白 (*head).next 在没有被 head 指向时如何 = 2200。除非 data 和 next 共享相同的地址?我很确定这是假的。
ptr -> data
等同于 (*ptr).data
对于像Node<T> *ptr
这样的普通指针,->
运算符相当于解引用指针然后访问一个成员。因此,您的示例等同于:
(*ptr).data;
(*ptr).next;
换句话说,表达式计算对象 指向 的成员 ptr
。
ANode
主要成员有:
1 - 指向另一个节点的指针。 (ptr
,在你的例子中)
2 - 它保存的数据值。 (data
,在你的例子中)
Head
代表列表中的第一个节点。
所以,
Node<T> *ptr = Head; // ptr points the ftrst node in the list.
while (ptr) // the last node points nowhere (NULL), so if ptr is NULL we hit the end of the list.
{
T n = ptr -> data; // This no need explanation.
ptr = ptr -> next; // now we want to ptr point to the node is pointing its `next` pointer.
}
这是指针 ptr
在列表中前进的方式:
更多问题
为什么我们必须解引用指针才能访问下一个指针甚至数据本身?
你不必。
ptr->data; // data is a member in a struct/class POINTED by ptr.
*ptr; // this is the class/struct INSTANCE (dereferenced). So
*ptr.data; // data is a member of that instance.
如果你有:
节点a; 节点 *ptr = &a; // 以下是相同的: a.next; ptr->下一个; *ptr.next;
此外,由于 ptr
将指向数据,您取消引用它以获得数据的实际值。对吗?
不,ptr
永远不会指向数据(根据示例代码)。
ptr->data; // This not means ptr will POINT to data.
// this means "access to the data member of whatever object being POINTED by ptr".
根据给定的代码,ptr实际上会指向链表中的每一个成员?
是的,你明白了!!
ptr->next
如何求值到下一个节点的地址?
指针也是一个变量。一个 int
变量保存 int
个值,一个指针保存 地址.
一个非常简单(且无用)的 Node
会是这样的:
struct Node {
Node *next; // Pointer to another node, yeah but ... which node? In a minute ;)
};
在某些时候,您将不得不编写如下代码:
// Example of adding a node.
Node* Head = new Node;
Node* another_node = new Node;
Head->next = another_node; // This is how Head->next "knows" which node is the next. Because we told him.
所以,现在如果我们用另一个指针指向 Head 的相同地址,假设 ptr
...
Node *ptr = Head;
然后我们可以通过 ptr->next
访问 Head
的 next 成员。当然,这会计算出 another_node
.