簡體   English   中英

為什么在RemoveHead(節點)函數中使用** head(而不是* head)?

[英]Why use **head (and not *head) in RemoveHead(node) function?

在書中的大多數解釋中,作者堅持使用**列表傳遞而不是* list,但是根據我的理解,我覺得* list中沒有任何錯誤。 如果我錯了,請有人詳細解釋我。 例如,要刪除鏈表的頭部,作者說下面的代碼是錯誤的。

void RemoveHead(node *head)
{
   node *temp = head-> next; /* line 1 */
   free(head);
   head = temp;
}

相反,他說必須使用以下代碼

void RemoveHead(node **head)
{
   node *temp = (*head)-> next;
   free(*head);
   *head = temp;
}

在你的第一個例子中:

head = temp;

在函數外部沒有任何功能,它只在函數內部將局部變量headtemp 無論調用者傳入什么變量都將保持不變。 作者是正確的,你需要使用指針或(更好的)引用(如果你使用的是C ++)。

傳遞node*作為參數時,可以釋放,並修改該指針指向的內存地址的內容 但是,從函數外部看不到對指針本身執行的修改,因為指針是按值傳遞的。

在第二個例子中,由於您正在傳遞一個指向頭指針的指針,您實際上可以修改實際的頭指針,而不僅僅是它指向的內存。

所以在你的第二個函數中,當*head = temp; 執行時,您正在修改指針作為參數指向的地址。

因此,作者是對的。

作者是對的。 **實際上是通過引用傳遞的(即你可以改變'head')。

在您的版本中(按值傳遞),head在調用代碼中保持不變。

好。 如果要修改函數內的整數變量,可以通過引用傳遞它。 也就是說,你傳遞了它的地址。

int x = 5;

void modify_value (int* x)
{
    (*x) = 7; // is not 5 anymore
}

用指針是一樣的。 如果要修改指針。 你必須通過引用傳遞它。 也就是說,你必須傳遞它的地址。 這是指向指針的指針。

int* ptr_x = &x;

void modify_pointer (int** ptr_x)
{
    *ptr_x = NULL; // is not &x anymore
}

作者是對的。 在您的第一個示例中,您正在修改head的本地副本 - 調用者不會注意到任何更改。 head仍然會被釋放,所以你可以在很短的時間內完成碰撞。 您需要傳遞一個指針來修改調用者的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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