C++函數參數傳遞:值傳遞與引用傳遞區別

在C++中,函數就像一個“加工機器”,我們需要給它輸入一些“原材料”(也就是參數),機器處理後輸出結果。而參數的傳遞方式,直接影響了“原材料”在函數內外的變化情況。最常見的兩種傳遞方式是值傳遞引用傳遞,今天我們就來詳細聊聊它們的區別。

一、值傳遞:複製一份“原材料”給函數

值傳遞是最基礎的參數傳遞方式。當使用值傳遞時,函數的形參(函數定義中的參數)會得到實參(調用函數時傳入的參數)的一份副本。這意味着,函數內部操作的是這個副本,不會影響原來的實參。

舉個例子:交換兩個變量的值(使用值傳遞)

// 定義一個函數,用值傳遞交換兩個int變量
void swap_value(int a, int b) {
    int temp = a;  // 臨時存儲a的值
    a = b;         // 修改形參a(副本)
    b = temp;      // 修改形參b(副本)
}

int main() {
    int x = 10, y = 20;
    swap_value(x, y);  // 調用函數,傳入x和y
    // 此時x和y的值還是10和20嗎?
    // 是的!因爲swap_value修改的是x和y的“副本”,原變量沒有變化
    return 0;
}

值傳遞的特點
- 傳遞的是“實參值的副本”,形參和實參是兩個獨立的變量。
- 函數內部修改形參,不會影響外部的實參。
- 適合不需要修改原數據的場景(比如求一個數的平方)。

二、引用傳遞:直接“借用”原變量

引用傳遞是C++特有的方式,使用引用類型(&符號)作爲參數。引用本質是變量的“別名”,它直接指向實參的內存地址,因此函數內部操作形參,就相當於直接操作實參。

同樣用交換變量的例子(使用引用傳遞):

// 定義一個函數,用引用傳遞交換兩個int變量
void swap_reference(int &a, int &b) {  // 形參是引用類型
    int temp = a;  // 臨時存儲a的值
    a = b;         // 修改形參a(原變量x)
    b = temp;      // 修改形參b(原變量y)
}

int main() {
    int x = 10, y = 20;
    swap_reference(x, y);  // 調用函數,傳入x和y
    // 此時x和y的值變成了20和10!因爲形參a和b是x和y的引用,修改它們等於修改原變量
    return 0;
}

引用傳遞的特點
- 傳遞的是“實參的引用”(本質是原變量的地址),形參和實參是同一個變量。
- 函數內部修改形參,會直接影響外部的實參。
- 適合需要修改原數據,或傳遞大對象避免複製開銷的場景(比如數組、大結構體)。

三、值傳遞 vs 引用傳遞:核心區別

對比項 值傳遞 引用傳遞
傳遞內容 實參值的“副本” 實參的“引用”(直接指向原變量)
修改影響 函數內修改形參,不影響實參 函數內修改形參,直接影響實參
形參類型 普通變量類型(如int 引用類型(如int &
適用場景 不需要修改原數據,或數據較小 需要修改原數據,或傳遞大對象
注意事項 可接受常量、表達式等 必須綁定已存在的變量(不能是臨時值)

四、小提示:如何選擇?

  • 用值傳遞:當你只需要“讀取”實參的值,不需要修改它時(比如計算一個數的平方)。
  • 用引用傳遞:當你需要“修改”實參的值,或傳遞大對象(如數組、大結構體)避免複製開銷時。
  • 避免混淆:引用參數調用時不需要加&,直接傳變量名即可(swap_reference(x, y))。

總結

值傳遞是“複製粘貼”,改了副本不影響原件;引用傳遞是“直接借用”,改了形參等於改原件。記住這兩個核心區別,就能根據需求選擇合適的參數傳遞方式啦!

小夜