[英]Having some doubts about C pointers and memory address
我真的是 C 的新手,我在 C 有这段关于 LinkedList 的代码:
struct ListNode* addnode(struct ListNode *head,int val)
{
struct ListNode* newnode = malloc(sizeof(struct ListNode));
newnode->val = val;
newnode->next = NULL;
if (!head) head = newnode;
else {
struct ListNode *this = head;
while(this->next)
this = this->next;
this->next = newnode;
}
return head;
}
int main(void)
{
struct ListNode *head = NULL;
head = addnode(head,4);
addnode(head,9);
addnode(head,1);
return 0;
}
我的问题是:主要是为什么我写
addnode(head,4);
addnode(head,9);
addnode(head,1);
代替
head = addnode(head,4);
addnode(head,9);
addnode(head,1);
不起作用? 第一个是创建以下链表:4->9->1,第二个是创建 3 个不同的链表头。 但是不就和我们一直使用head的memory地址一样吗? 所以 head 总是在保存他之前的节点。
提前谢谢你,我会很感激你的回答
最初指针head
被初始化为一个null指针
struct ListNode *head = NULL;
该指针按值传递给 function addnode
addnode(head,4);
function 处理在 main 中声明的指针head
值的副本,用作 function 的参数表达式。更改副本不会影响原始指针head
。
所以在调用之后指针head
仍然是一个 null 指针。
function 返回指针副本的修改值
struct ListNode* addnode(struct ListNode *head,int val)
{
//...
if (!head) head = newnode;
//...
return head;
}
要更改原始指针head
,您需要将返回值分配给指针head
,如
head = addnode(head,4);
现在指针head
指向列表的第一个节点。
function 的所有其他电话
addnode(head,9);
addnode(head,1);
append 个新节点到列表的尾部。 也就是说,这些调用不会影响指向列表第一个节点的指针的值。 因此,无需将 function 的返回值分配给指针head
,尽管您可以编写
head = addnode(head,9);
head = addnode(head,1);
为了更清楚地考虑一个非常简单的例子
#include <stdio.h>
int f( int x )
{
x += 1;
return x;
}
int main( void )
{
x = 0;
f( x );
printf( "x = %d\n", x );
}
如果您不替换此声明
f( x );
为了
x = f( x );
那么变量x
在调用 function f
后不会在 main 中更改,因为 function f
更改了用作 function 参数的变量x
值的副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.