c ++链表迭代成员访问运算符

时间:2015-03-25 12:31:19

标签: c++ linked-list iteration

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;

如果某人能够逐步了解这些表达式的评估方式,那就太棒了。

编辑::

enter image description here

怎么做:

head->next;

得到评估地址2200.我不知道怎么(* head).next可以= 2200,当它没有被头部指向时。除非数据和下一个共享相同的地址?我相当肯定是假的。

3 个答案:

答案 0 :(得分:1)

Node必须有主要成员:

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在列表中前进的方式:

Describe how the pointer <code>ptr</code> advances through the list

进一步的问题

为什么我们必须解除指针访问下一个指针甚至数据本身?

你不必。

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 =&amp; a;    //以下是相同的:    a.next;    ptr-&gt;接着,    * 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;

然后我们可以通过Head访问ptr->next 下一个成员。当然,这会评估another_node的地址。

答案 1 :(得分:0)

ptr -> data相当于(*ptr).data

答案 2 :(得分:0)

对于像Node<T> *ptr这样的普通指针,->运算符等效于取消引用指针然后访问成员。因此,您的示例等同于:

(*ptr).data;
(*ptr).next;

换句话说,表达式通过ptr计算对象指向的成员。