[英]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.