打印出链接列表时,为什么原始头指针不会更改

时间:2014-03-22 12:39:14

标签: c pointers linked-list

我已经写了一些代码来创建一个单独链接的整数列表并打印出这些项目。打印出列表中的所有项目后,我打印出" head-> item"并获得第一个节点中的整数值。

我很困惑为什么我能这样做,因为在print()函数中,我写了&#34; head = head-&gt; next&#34;,这意味着头部被改变了?< / p>

main()
    int n;
    int value;
    ListNode *head = NULL;
    ListNode *temp = NULL;
    printf("Enter a value: ");
    scanf("%d", &n);
    while (n != -1)
    {
        if (head == NULL)
        {
            head = malloc(sizeof(ListNode));//create the head first
            temp = head;//get temp to have the same value as head, so we do not accidently edit head
        }
        else
        {
            temp->next = malloc(sizeof(ListNode));//allocate space for the next node
            temp = temp->next;//let temp be the next node
        }
        temp->item = n;//allocate a value for the node
        temp->next = NULL;//specify a NULL value for the next node so as to be able to allocate space
        scanf("%d", &n);
    }
    print(head);
    printf("%d\n", head->item);//why can I still get the integer in the first node
    while (head != NULL)
    {
        temp = head;
        head = head->next;
        free(temp);
    }
    head = NULL;
    return 0;
}
void print(ListNode *head)
{
    if (head == NULL)
    {
        return;
    }
    while (head != NULL)
    {
        printf("%i\n", head->item);
        head = head->next;
    }
}

1 个答案:

答案 0 :(得分:3)

head可以被视为列表的“引用”,但它实际上是一个数字(第一个节点的地址)。 因此,使用head作为参数调用函数只需将此“数字”(地址)复制到堆栈,并创建一个使用相同地址启动的新变量(也称为head) 。 由于函数内的head是另一个变量,因此更改它不会更改原始head

考虑这种情况:

void func(int x)
{
    x=1;
}
...
int x=0;
func(x);
printf("%d",x); //Prints '0'
...

请确保您了解为什么在此简单示例中x的值不会更改。确实,指针似乎改变了参数传递的行为,但这并不意味着突然一切都通过“引用”传递。

请记住此规则:为了修改函数中变量的值,您需要发送一个指向变量的指针。那么当你想将指针更改为变量时会发生什么?好吧,根据规则,你必须将指针传递给指针。

因此,如果你想修改head(你可能没有),请像这样重构:

void print(ListNode **head)
{
    if (*head == NULL)
    {
        return;
    }
    while (*head != NULL)
    {
        printf("%i\n", *head->item);
        *head = *head->next;
    }
}

实际通话现在​​是print(&head)