【问题标题】:Failing to understand pointers?看不懂指针?
【发布时间】:2012-03-25 09:52:06
【问题描述】:

我有一个链表指针向量。

每个 LinkedList 都有一个头指针,它是指向节点的指针。该节点当然是列表的头部。

vector[3] 的头部与vector[0] 的头部相同。 我将vector[0]的头指针更改为指向vector[1]指向的同一个节点,或者vector[1]的头。

但是vector[3]的头指针永远不会改变。我怎样才能得到它,以便通过更改 vector[0] 的头指针,我也可以更改 vector[3] 的头指针? 我尝试了 2 种不同的方法。没有一个有效。

vector[0]->head=vector[1]->head;
*(vector[0]->head)=*(vector[1]->head);

【问题讨论】:

    标签: c++ linked-list


    【解决方案1】:

    你不能用一个赋值来改变两个值。

    在您的情况下,有 vector[0]->headvector[1]->head,两个具有两个值的不同指针。只要您保持它们不变,它们就会相等,通过在更改另一个时更改一个。

    您可以使用额外的间接级别:

    Node* commonPointer = head_of_some_list;
    
    VectorElement { ... Node **head; }
    
    vector[0]->head = &commonPointer;
    vector[3]->head = &commonPointer;
    
    *(vector[0]->head) = head_of_another_list;
    //Now *(vector[0]->head), *(vector[3]->head) and commonPointer all eventually point to head_of_another_list;
    

    虽然这闻起来不像是好的设计。

    【讨论】:

      【解决方案2】:

      我现在看不到解决您的问题的简单方法(会考虑一下 :)),但我认为您应该了解为什么您的代码行为与您的预期不同。 我想我们在这里谈论的是 STL 向量,即容器 具体来说,这意味着您在每个向量条目内获得了链表头的 copy,因此修改 vector[i] 中指针的 copy 不会影响vector[j]
      我的两分钱: 使用带有 key = head 指针的地图是否适合您的需要?或者你真的需要不同的元素来追踪同一个列表吗? 希望这会有所帮助

      捋捋捋捋 塞尔吉奥

      【讨论】:

        【解决方案3】:
        vector[0] = &HeadA; &HeadA->head points to Node A
        vector[1] = &HeadB; &HeadB->head points to Node B
        vector[3] = &HeadC; &HeadC->head points to Node A
        

        如果将vector[0]->head 更改为指向节点B,则不会更改vector[3]->head 的内容,因为它是一个完全独立的变量。

        你必须设置vector[3] = vector[0],而不是设置vector[3]->head 指向节点A。这意味着向量的第 1 个和第 4 个元素包含指向同一个 Head 对象的相同指针:

        vector[0] = &HeadA; &HeadA->head points to Node A
        vector[1] = &HeadB; &HeadB->head points to Node B
        vector[3] = &HeadA; &HeadA->head points to Node A
        

        【讨论】:

          【解决方案4】:

          我相信你真正的问题是没有很好地理解指针和链表。指针可能有点难以理解。不过,我会尝试回答您的问题。

          首先,请注意 C++ 和 Java 中的指针行为不同,指针归结为按引用传递和按指针传递。

          通过引用传递表示所做的更改将被保留,并且通过指针传递会创建一个副本,其中更改不会是永久性的。

          此外,据我了解,您有 vector[0]->head vector[3]->head 指向相同的内存地址,但后来更改了 vector[0]->head 指向的内容。这不会更改为vector[3]->head,因为它仍然指向之前指向的内存地址vector[0]->head。

          如果你想让它们指向同一个位置,你也必须将 vector[3]->head 指向 vector[1]->head。

          希望对我有所帮助(我是堆栈溢出的新手)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-21
            • 2015-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多