簡體   English   中英

對 C 指針和 memory 地址有一些疑問

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM