我很难理解指针。我的印象是,如果'指针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的指针不会改变?运行
谢谢!
答案 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
。