| 方式 | 語法 | 記憶體行為 | 能否修改實參 | 典型場景 |
|---|---|---|---|---|
| 值傳遞 | void f(int x) | 新開闢棧空間複製值 | 否 | 小型對象、不需修改、需副本隔離 |
| 指針傳遞 | void f(int* x) | 新開闢空間存實參地址 | 可修改指向內容,不可修改指針本身 | C 風格、可選參數 (nullptr)、需修改指針指向 |
| 引用傳遞 | void f(int& x) | **不開闢新空間**,實參別名 | 是 (完全等同實參) | 大型對象、需修改實參、運算符重載、避免拷貝 |
| 指針引用 | void f(int*& x) | 不開闢新空間,指針別名 | 可修改指針本身及指向內容 | 需在函數內修改指針指向 (如鏈表頭插入、工廠函數分配記憶體) |
void add(int x) { x++; } // 形參地址 ≠ 實參地址,修改不影響實參
void add(int* x) { x++; } // 修改指針本身,實參指針不變
void add(int* x) { (*x)++; } // 修改指向內容,實參指向內容變化
void add(int& x) { x++; } // 形參地址 = 實參地址,直接修改實參
void add(int*& x) { x++; } // 修改指針本身,實參指針同步變化
void add(int*& x) { (*x)++; } // 修改指向內容,實參指向內容同步變化
void f(const BigObj&))。initList(Node*& head) 分配頭節點)。void init(Node*& p) 配合 Node* p; 比 Node* p; init(p); (值傳遞指針) 更安全,因引用綁定要求實參已存在。std::unique_ptr 按值傳遞 (移動語義)。std::shared_ptr 按值傳遞。T* 或 const T&。T&,次選 T* (需明確可為 null)。理解參數傳遞的記憶體模型是寫出高效、正確 C++ 代碼的基石。引用本質是「別名」,指針引用是「指針的別名」,兩者均不產生額外存儲開銷,是大型對象與輸出參數的首選機制。