初學者常見困惑:`swap(x, y)` 函數內部交換了形參 `x`、`y` 的值,為什麼主函數中的實參 `a`、`b` 沒有變化?「單向傳遞」究竟如何運作?
C 語言只有值傳遞。調用函數時,系統為形參分配臨時存儲空間,將實參的值的副本複製給形參。函數內部操作的是副本,不影響原始變量。
void swap(int x, int y) { // 形參 x, y 是實參 a, b 的副本
int t = x;
x = y;
y = t;
// 此處僅交換了副本的值
}
int main() {
int a = 10, b = 20;
swap(a, b); // 傳遞 a, b 的值 (10, 20)
// a 仍為 10, b 仍為 20
}
這是經典的中間變量交換法:
若直接寫 `x = y; y = x;`,第二步執行後 `x` 已變為 `y` 的值,原 `x` 值丟失,導致兩個變量值相同。
若需在函數內修改實參值,必須傳遞實參的地址,函數參數類型為指針。
void swap(int *px, int *py) { // 形參為指針,接收地址
int t = *px; // 解引用獲取值
*px = *py; // 通過地址修改原變量
*py = t;
}
int main() {
int a = 10, b = 20;
swap(&a, &b); // 傳遞地址
// a=20, b=10 交換成功
}
調用 swap(&a, &b) 時:
棧幀 main: a [地址 0x100, 值 10] b [地址 0x104, 值 20]
棧幀 swap: px [地址 0x200, 值 0x100] py [地址 0x204, 值 0x104]
↑ ↑
└────────── 指向 ─────────────┘
*px 解引用訪問 0x100 處內存,直接修改 a 的值。