首页 > 解决方案 > 无法理解用于链表的指针

问题描述

在链表中,如果start是头节点,并且同一个节点的任何临时节点指针都是 say temp,那么这个赋值实际上是什么意思:

temp = start;

这是否意味着 start 的地址放在 temp 中还是什么?

这些分配也用于许多其他节点,这让我很困扰。

标签: clinked-list

解决方案


我将不得不在这里填写一些细节,因为它仅暗示在您的问题中可以找到哪些细节。列表的基本形式是:

struct list_node {
    void *data;
    struct list_node *next;
};

您的问题似乎是关于指向与此类似的列表的两种相同的指针类型。 IE

struct list_node *start, *temp;

此外,您声明start“是头节点”,我假设这意味着它也是一个指针,它指向列表的头。为了简单起见,我假设这个头节点存储在堆栈中:

struct list_node head = { NULL, NULL };
start = &head;

现在到你的实际问题:

这个任务实际上意味着什么

temp = start;

这只是制作指针的副本start并将其存储在另一个名为temp. 因为在我的示例中,start指向head,现在temp 指向head。没什么特别的。它只是两个命名的值starttemp它们都恰好引用相同的内存位置(在这种情况下,存储的内存区域head)。

您会在与列表相关的代码中经常看到这一点的一个原因是,您通常只有一个指向列表开头的指针,但您还需要遍历列表以对每个节点执行某些操作。您不能只修改该指针的一个副本,因为您可能想稍后使用它。因此,您只需将其存储在另一个变量中(在本例中为temp)并在迭代时修改该变量。 例如

for(temp = start; temp != NULL; temp = temp->next)
{
    // ...
}

这是否意味着 start 的地址放在 temp 或什么

虽然我已经解决了你的问题,但我想特别强调一下这个关于你的问题的问题。

答案是否定的: 的地址是指向指针的指针(在这种情况下,它的类型是start)。&startstruct list_node **

相反,您可以说所持有的 start地址存储在 temp.


推荐阅读