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

C/C++ 函數參數傳遞機制深度解析:值、指針、引用的本質區別

     編輯:關於C語言

四種交換函數對比


// 1. 值傳遞:無法修改實參
void Exchg1(int x, int y) {
    int tmp = x; x = y; y = tmp;
}

// 2. 指針傳遞:修改指向的內存(正確)
void Exchg2(int *px, int *py) {
    int tmp = *px; *px = *py; *py = tmp;
}

// 3. 指針傳遞(錯誤):修改局部指針副本
void Exchg3(int *px, int *py) {
    int *tmp = px; px = py; py = tmp;  // 僅交換局部指針變量
}

// 4. 引用傳遞 (C++):別名機制,修改實參(正確)
void Exchg4(int &x, int &y) {
    int tmp = x; x = y; y = tmp;
}

內存模型圖解

值傳遞

實參 a=3, b=5 → 形參 x=3, y=5(獨立副本)→ 交換 x,y → 實參 不變。

指針傳遞(正確)

實參 &a, &b → 形參 px=&a, py=&b(地址副本)→ *px 即 a,*py 即 b → 交換 成功。

指針傳遞(錯誤)

形參 px, py 是指針副本,px = py 只改變局部指針指向,不影響實參地址。

引用傳遞

形參 x, y 是實參 a, b 的別名,編譯器自動解引用,語法如值傳遞,效果如指針。

本質總結表

機制傳遞內容能否修改實參語法特徵適用場景
值傳遞值的副本否func(a)小對象只讀、需副本隔離
指針傳遞地址的副本是(通過解引用)func(&a)需修改實參、可空、C接口、數組
引用傳遞別名(隱式指針)是func(a)C++首選修改參數、大對象只讀

經典誤區

  1. 以為指針傳遞就能修改指針本身:形參是指針副本,修改形參指向不影響實參指針。需傳 ** 或引用指針 *&
  2. 混淆 p = q 和 *p = *q:前者改指向,後者改值
  3. 引用當成值傳遞優化:引用有別名語義,非單純避免拷貝;大對象只讀用 const T&

最佳實踐

  • C++:優先 const T&(只讀)、T&(修改)、T&&(移動)
  • C:const T*(只讀)、T*(修改)、T**(修改指針)
  • 基本類型(int/float/指針)值傳遞開銷極小,無需刻意用引用

理解參數傳遞的內存模型,是寫出正確、高效、無副作用函數的前提。

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