为什么这两个指向节点值的指针不相等?

时间:2019-10-27 23:12:14

标签: c++ pointers data-structures nodes c++17

我想用指针创建一个链表。因此,我创建了一个带有指针和值的结构,该指针是指向列表的下一个节点的指针。

当我尝试为下一个节点设置Poniter时,我想通过从第一个节点指向它来更改下一个节点的值,但是当我尝试通过直接从节点结构访问来显示值时,我得到另一个结果,我该如何使它们相等?这样,如果我更改一个,无论从何处更改,节点的值都将更改。

这是针对大学项目的,我们需要使用链接列表。我只是开始学习指针主题,因此我会接受任何帮助。


#include <iostream>

struct node
{
    double val;
    node *nxt;
};

int main()
{
    node n1, n2;

    n1.val = 10;
    n1.nxt = new node{n2};

    n1.nxt->val = 20;

    std::cout << "List:\n";
    std::cout << n1.val << "\n"
              << n2.val << "\n";
}

实际结果:

列表:

10

1.39065e-309

预期结果:

列表:

10

20

2 个答案:

答案 0 :(得分:0)

更改此行:

n1.nxt = new node{n2};

n1.nxt = &n2;

之所以无法执行,是因为您正在使用 n2 创建 new node{n2} 的副本(因为C ++定义了implicit copy constructor替换为class),因此正是该副本的 val 更改为 20

通过使用 [1] 操作符( & )的地址,您可以将指针分配给 n2 ,因此可以使用 n1.nxt->val = 20 更改其值。

答案 1 :(得分:0)

那是因为您实际上是在分配一个新的node,而不是实际上将您的nxt链接设置为保留实际的n2节点。

如果希望将此节点添加到链接列表,则应使用(&)运算符的地址:

n1.nxt = &n2;

请记住,不建议您以这种方式创建链接列表,特别是如果您在诸如addNode()之类的辅助函数中执行此操作,因为一旦功能退出,n2将被销毁。因此,通常最好使用new或类似的方法。看起来像这样:

n1.nxt = new node(/* node constructor parameters */);

或者,如果您要复制现有的node

n1.nxt = new node{n2};