【问题标题】:How does a struct pointer differentiate between the use of the same pointer?结构指针如何区分相同指针的使用?
【发布时间】:2021-05-29 00:48:46
【问题描述】:

这是来自极客的极客示例。最后一个例子是 root->left->left = new Node(4); 我想知道左节点如何保留其旧值,并且能够使用相同的结构变量连接到新值。每次调用“新节点()”时都会创建另一个内存块还是什么?我很困惑。

using namespace std;

struct Node {
    int data;
    struct Node* left;
    struct Node* right;

    // val is the key or the value that
    // has to be added to the data part
    Node(int val)
    {
        data = val;

        // Left and right child for node
        // will be initialized to null
        left = NULL;
        right = NULL;
    }
};

int main()
{

    /*create root*/
    struct Node* root = new Node(1);
    /* following is the tree after above statement

            1
            / \
        NULL NULL
    */

    root->left = new Node(2);
    root->right = new Node(3);
    /* 2 and 3 become left and right children of 1
                    1
                / \
                2    3
            / \  / \
            NULL NULL NULL NULL
    */

    root->left->left = new Node(4);
    /* 4 becomes left child of 2
            1
            /    \
        2    3
        / \  / \
        4 NULL NULL NULL
        / \
    NULL NULL
    */

    return 0;
}

【问题讨论】:

  • 是的,new 就是这样做的。您的 C++ 教科书中是否有关于 new 工作原理的解释以及您不清楚的内容?您的问题不清楚。
  • 所以也许我不清楚Node* root 的指针是如何指向的但是当struct Node* root = new Node(1); 这将返回一个指向Node(1) 的内存位置的指针,对吗?那么,当我们每次都继续分配内存时,这是否会创建每次指向的新内存块,还是会保留相同的内存地址?如果保留相同的内存地址,Node(2)、Node(3)、Node(4)分别存放在哪里,root->left->left = new Node(4);说根-> 现在在下树时绑定到left 的第一个实例?
  • 同样,new 的工作原理在每一本 C++ 教科书中都有解释。你的教科书如何解释new,你能引用一段你不清楚的简短摘录吗?
  • @Zboyz 嗯...如果我正确阅读了您的评论,您是在问发生了两件事中的哪一个。对于第二个选项(“保留相同的内存地址”,无论这意味着什么),您会提出一个无法实现该选项的原因列表。那么为什么会出现混乱呢?所有迹象都指向第一个选项,不是吗?你似乎已经知道答案了。忽略你的想象力(也就是第二个选项)并选择第一个。

标签: c++ data-structures binary-tree


【解决方案1】:

root->left = new Node(2);root->left->left = new Node(4); 都在内存中创建新的 Node 对象,所以你有疑问

每次调用“new Node()”是在创建另一个内存块还是什么?

有点准确。

最初,root 是一个 Node 对象,其数据值为 1,左值为 NULL。它的左指针指向任何东西。语句root->left = new Node(2); 将根左指针设置为新节点的地址。这个新节点的数据值为 2,左值为 NULL。想象这个新节点有一个名字,它的名字是 A。表达式root->left->left 从左到右求值,所以root->left 是节点 A,因此表达式变成 A->leftA->left 当前为 NULL。执行root->left->left = new Node(4);后,A 的左指针现在指向一个数据值为 4 的新节点。

【讨论】:

  • 所以基本上每次为单独的节点调用 new 时都会分配一块内存 root bound 2 让我们说“A”并且该链接已建立,所以真正发生了什么是而不是root->left->left = new Node(4); 我可以把它解释为root->A->left-> new Node(4); 现在新的left 是4 并且有一个左右空指针?
  • 块或内存不是严格正确的,但是是的,每次调用 new 时都会创建一个新的 Node 对象。我的替换只是尝试显示从左到右的评估。 root->left->left 更容易被认为是 A->left,其中 A = root->left。每个对象都有自己的左侧,因此示例中有 4 个 Node 对象。根,根->左,根->右,根->左->左。 root->left 是它自己的对象,而 root->left->left 是 root->left 的左边。这用图片更容易解释。
  • 现在知道了。谢谢。没有看到this 对我来说更难,但我想这暗示着箭头运算符?不管我现在明白了,谢谢。
猜你喜欢
  • 2010-09-25
  • 2018-05-16
  • 1970-01-01
  • 2013-12-13
  • 2020-12-14
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多