0

假设我有以下链表结构:

struct linked_list
{
    struct linked_list *next;
    int data;
};
typedef struct linked_list node;

以及打印链表的以下函数:

void print(node *ptr)
{
    while(ptr!=NULL)
    {
        printf("%d ->",ptr->data);
        ptr=ptr->next;
    }
}

现在在main()我写这个的函数中:

print(head); // Assume head is the pointer pointing to the head of the list

这本质上是按值调用。因为ptrinprint会收到一份head. 而且我们不能headprint()函数中修改,因为它是按值调用的。

但我的疑问是,既然ptr收到了一份head但它能够打印出链表的值。那么这是否意味着该print()函数接收链表的整个副本?如果它没有收到链表的整个副本,它如何能够打印链表?

4

2 回答 2

4

您的函数接收指针的副本。指针的副本指向与原始指针相同的位置。

指针就像一个地址。这是一个类比。想象一下在一张纸上写下你的地址。当你想把它给朋友时,你复制地址:也就是说,你在一张新纸上写下相同的地址,然后把那张纸给你的朋友。但是如果他们去他们副本上写的地址,他们会去同一个地方,就像他们去原始纸上的地址一样。

于 2012-07-29T23:02:21.287 回答
0

print接收头地址的副本,这意味着表示的数据head没有被复制:该函数使用实际的头,因此使用实际的链表,而不是副本。

这意味着您可以更改head,例如head->data,并且您可以修改链表的其余部分。你唯一不能做的就是改变你传入的指针指向节点,即你不能做head = NULLinprint并期望它反映在外面print

因此,以下任何更改都反映在函数之外:

// pick one:
ptr->data = 20;
ptr->next = NULL;
ptr->next = malloc(sizeof(node));
ptr->next->data = 20;
// etc.

以下不是

ptr = NULL;
ptr = malloc(sizeof(node));
于 2012-07-29T23:02:32.330 回答