C ++使用指针指向另一个指针

时间:2016-12-26 19:56:00

标签: c++ pointers

我正在从Herbert Schildt的书中学习C ++"教自己C ++第3版"。在一个示例代码中,有些东西让我很困惑。

#include <iostream>
using namesapce std;

template <class data_t> class list {
    data_t data;
    list *next;

    public:
        list(data_t d);
        void add(list *node) {node->next = this; next = 0; }
        list *getnext() { return next;}
        data_t getdata() { return data;}
};

我没有在示例中编写所有代码,我只写了类声明。 在这里,我没有理解一部分。首先,&#34; *节点&#34;指针属于&#34;添加&#34;功能,正在使用&#34; node-&gt; next&#34; for&#34; * next&#34;指针。我没有理解这里的目标,为什么我们不直接使用像{&#34; next = this; next = 0;}?另外,我们如何使用空指针(*节点)指向另一个空指针(* next)?我想念一些关键概念,谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

在函数add()中:

template<typename data_t>
class list {
    // ...
    void add(list *node) {node->next = this; next = 0; }
    // ...
};

该功能的目的是将this添加到列表中,作为node之后的下一个元素。把它想象成一列火车:add()告诉当前的汽车将自己挂在另一辆汽车的后面,功能的参数告诉它要链接到哪辆车。
请注意,此函数要求node 为空指针;如果它为null,则可能会出现分段错误。

void add(list* node) {
    node->next = this; // Tells "node" to register the current node as its "next" node.
                       // Should first check whether "node" is a valid pointer.
    next = 0;          // Tells the current node to register a null pointer as its "next" node,
                       //  signifying that it's currently the last node in the list.
                       // Note that instead of assigning 0, it should instead assign either
                       //  "nullptr" (C++11 or later) or "NULL" (pre-C++11).
}

因此,当这样使用时:

list<int> start(42), second(24);
second.add(&start);

它将执行以下操作:

(&start)->next = &second;
(&second)->next = 0;

这会创建一个单链表,如下所示:

Start: "start"
  --> Next: "second"
    --> Next: None.

或者,更简洁:

start->second->NULL

请记住,当在非静态成员函数内部时,除非另有说明,否则假定任何成员变量访问都在this上运行。

template<typename data_t>
void list<data_t>::add(list* node) {
    node->next = this; // Operates on node, not on this.
    next = 0;          // Operates on this; becomes "this->next = 0;"
}

如果此函数只是{next = this; next = 0;},那么它将是:

template<typename data_t>
void list<data_t>::add(list *node) {
    this->next = this; // Bad.  Creates a circular linked list, where "this" is ALWAYS the
                       //  next node after "this".
    this->next = 0;    // Renders the above line entirely pointless, by indicating that there
                       //  are no nodes after "this".
}