理解链表中的指针

时间:2017-08-27 03:52:13

标签: c pointers linked-list

我很难理解指针。我的印象是,如果'指针a'指向'指针b',并且让'指针b'改变,'指针a'将随之改变。

但是,对于链表,例如以下

struct Node *deleteFirst(struct Node *head)
{
    if(head != NULL)
    {
       // store the old value of head pointer
       struct Node *temp = head;

       // Change head pointer to point to next node
       head = head->next;

       // delete memory allocated for the previous head node
       free(temp);
    }

    return head;
}

当'head = head-> next;'时,为什么temp的指针不会改变?运行

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么要改变?假设你有这个东西。

a = 1;
b = a;
b++;

您希望a改变吗?

在这种情况下,两者都是不同的指针变量,在一个点上保持相同的地址。您现在正在更改head以保留其他地址。为什么你认为它会改变另一个变量? 它赢了

为了清楚你的想法,我会告诉你: -

    [ ]<---next---[ ] <---head

struct Node *temp = head;
    [ ]<---next---[ ] <--head
                   ^
                   |-----temp

Now you change head.head = head->next;
    [ ]<---next---[ ]
     ^             ^
     |             |-----temp
     head

在指针的情况下,我们基本上持有一个地址。无论我们持有什么地址,我们都可以改变它的内容。

b = 2
int *a =&b;
*a = 3;
// b is now 3.

现在让我们检查一下。

b=2
c=4
int* a = &b;
int** aa = &a;

现在我们在aa中持有哪个地址? 答:a

我们可以改变吗?我们可以。 (*aa) = &c;

那么现在它改变了什么?它改变了a的内容。 // * a现在等于值4.

我猜你需要了解所有我需要了解的指针。 (使用它你几乎可以理解任何与指针相关的代码。)

额外说明: 您显示的代码基本上是从链表中删除节点。

答案 1 :(得分:1)

要在评论中重申上述内容,struct Node *temp = head;会将head的指针值保存到temp。关注head = head->next;,不会更改temp,因为它只保留head的副本值。

演示原则但用整数

#include <stdio.h>

int main()
{
    int a = 5;
    int b = 42;

    int* a_ptr = &a;
    int* c = a_ptr; /* c holds a copy of the address of a */

    a_ptr = &b; /* Changes to a_ptr does not affect c */
    printf("%p != %p",a_ptr, c);

    return 0;
}

示例输出

0x7fff5faceb08 != 0x7fff5faceb0c

或许你的想法是,当指针a指向另一个指针b时,a引用b,并且后续更改为b }也影响a。然而,并非如上例所示的情况。要模仿引用的效果,您需要原始值的地址。

#include <stdio.h>

int main()
{
    int a = 5;
    int b = 42;

    int* a_ptr = &a;
    int** c = &a_ptr;

    a_ptr = &b; 
    printf("%p == %p",a_ptr, *c);
}

输出

0x7fff5dae7b08 == 0x7fff5dae7b08

此处对a_ptr的更改确实会影响*c