首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C/C++ 鏈表傳遞頭指標修改不生效:指標傳值 vs 指標傳址(雙重指標/引用)

     編輯:程式設計疑難解答

現象

函式參數為 `Node* head`,函式內 `head = new Node(...)` 或 `head->next = ...`,返回後呼叫端 `head` 仍為 `NULL` 或原值。

根因

C/C++ 採用呼叫傳值。`Node* head` 是指標的副本,函式內修改副本指向的記憶體(如 `head->next`)可影響原物件,但修改副本本身(`head = ...`)不影響呼叫端的實參指標。

解決方案

  1. C++ 參考傳遞:`void insert(Node*& head, int val)` —— 推薦,語法清晰。
  2. C 雙重指標:`void insert(Node** head, int val)`,呼叫端傳 `&head`,函式內 `*head = new Node(...)`。
  3. 回傳新頭指標:`Node* insert(Node* head, int val) { ... return head; }`,呼叫端 `head = insert(head, val);`。

程式碼對比

// 錯誤
void push_wrong(Node* head, int v) { head = new Node(v); }

// 正確:C++ 參考
void push_ref(Node*& head, int v) { head = new Node(v); }

// 正確:C 雙重指標
void push_dptr(Node** head, int v) { *head = new Node(v); }

// 正確:回傳值
Node* push_ret(Node* head, int v) { return new Node(v); }

結語

「函式需要修改指標本身(而非指向的物件)時,必須傳遞指標的地址(雙重指標)或使用 C++ 參考。」這是指標進階的核心考點,也是資料結構實作的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved