![](/img/trans.png)
[英]why cannot use the double pointer as the return type in function 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;
在函數外部沒有任何功能,它只在函數內部將局部變量head
為temp
。 無論調用者傳入什么變量都將保持不變。 作者是正確的,你需要使用指針或(更好的)引用(如果你使用的是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.