首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 參數傳遞全解析:值傳遞、指針、引用與指針引用

     編輯:關於C++

四種傳遞方式的核心差異

方式語法記憶體行為能否修改實參典型場景
值傳遞void f(int x)新開闢棧空間複製值否小型對象、不需修改、需副本隔離
指針傳遞void f(int* x)新開闢空間存實參地址可修改指向內容,不可修改指針本身C 風格、可選參數 (nullptr)、需修改指針指向
引用傳遞void f(int& x)**不開闢新空間**,實參別名是 (完全等同實參)大型對象、需修改實參、運算符重載、避免拷貝
指針引用void f(int*& x)不開闢新空間,指針別名可修改指針本身及指向內容需在函數內修改指針指向 (如鏈表頭插入、工廠函數分配記憶體)

代碼驗證:地址與值的變化

值傳遞

void add(int x) { x++; } // 形參地址 ≠ 實參地址,修改不影響實參

指針傳遞 (修改指向 vs 修改內容)

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)++; }   // 修改指向內容,實參指向內容同步變化

實戰指南:如何選擇?

  1. 首選引用:需修改實參、大型對象避免拷貝、運算符重載。
  2. const 引用:不修改實參的大型對象 (void f(const BigObj&))。
  3. 指針引用:函數需**修改指針本身** (如 initList(Node*& head) 分配頭節點)。
  4. 值傳遞:基本類型、小型結構體、需副本隔離邏輯。
  5. 避免未初始化指針風險:void init(Node*& p) 配合 Node* p; 比 Node* p; init(p); (值傳遞指針) 更安全,因引用綁定要求實參已存在。

新式 C++ 建議 (C++11+)

  • 所有權轉移用 std::unique_ptr 按值傳遞 (移動語義)。
  • 共享所有權用 std::shared_ptr 按值傳遞。
  • 觀察者 (不持有所有權) 用 T* 或 const T&。
  • 輸出參數優先 T&,次選 T* (需明確可為 null)。

總結

理解參數傳遞的記憶體模型是寫出高效、正確 C++ 代碼的基石。引用本質是「別名」,指針引用是「指針的別名」,兩者均不產生額外存儲開銷,是大型對象與輸出參數的首選機制。

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