我写了一个Push()函数来推送链表中的元素。 下面是代码,我先写了:
struct node {
int data;
struct node *next;
};
void Push(struct node*, int);
int main(int argc, char** argv) {
struct node *list = NULL;
Push(list, 23);
return 0;
}
void Push(struct node *list, int data) {
struct node *newNode;
newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = data;
newNode->next = list;
list = newNode;
}
代码编译得很好并且也可以执行但是无论我在List上推送了多少个数字,这些更改都没有反映出来,而且列表仍然是空的。
然后我用另一种方式创建了这个函数并使用了这样的双指针:
struct node {
int data;
struct node *next;
};
void Push(struct node**, int);
int main(int argc, char** argv) {
struct node *list = NULL;
Push(&list, 23);
return 0;
}
void Push(struct node **list, int data) {
struct node *newNode;
newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = data;
newNode->next = *list;
*list = newNode;
}
这里的代码效果很好,并将元素推送到列表中,并且反映了更改。
所以,为什么它会显示出这样不同的行为,即使我做了一个小测试并发现两者都
*list
和
list
包含相同的地址。以下是我为测试所做的事情:
struct node {
int data;
struct node *next;
};
void CheckAddress1(struct node *list) {
printf("Address1 is: %p\n", list);
}
void CheckAddress2(struct node **list) {
printf("Address3 is: %p\n", *list);
}
int main(int argc, char** argv) {
struct node *list = NULL;
CheckAddress1(list);
CheckAddress2(&list);
return 0;
}
,输出
Address1 is: (nil)
Address3 is: (nil)
这是因为两者都指向同一位置。 所以这意味着两者都应该有效。然后为什么不同的工作。你们可以详细说明吗?感谢
答案 0 :(得分:2)
list
中的 main()
具有列表中第一个元素的地址。 *list
提供list
指向的内存位置中的内容。
在您的第一个程序中,您按价值将list
传递给Push()
。这意味着list
中的Push()
仅仅是list
中main()
的副本,对list
的{{1}}所做的任何修改都是不反映回Push()
中的那个。
在第二个程序中,您将main()
中的list
指针作为main()
的参数传递给Push()
,并在Push()
中操纵指向内存位置的值通过此指针,您可以有效地修改list
中的main()
。
因此,您在Push()
中所做的更改会反映给程序2的main()
,但不会反映给程序1。