// 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++首選修改參數、大對象只讀 |
** 或引用指針 *&p = q 和 *p = *q:前者改指向,後者改值const T&const T&(只讀)、T&(修改)、T&&(移動)const T*(只讀)、T*(修改)、T**(修改指針)理解參數傳遞的內存模型,是寫出正確、高效、無副作用函數的前提。