在 C 語言中,函數參數傳遞只有「傳值」一種機制。所謂「傳址」或「傳引用」,本質上都是透過傳遞指標(位址)來間接修改呼叫端變數的值。
| 呼叫端(實參) | 函數端(形參) | 說明 |
|---|---|---|
sum(a, b) | sum(int a, int b) | 傳值:形參獲得實參的副本,函數內修改不影響外部。 |
sum(a, b) | sum(int *a, int *b) | 傳址:實參需傳 &a, &b,形參為指標,可透過解參考修改外部變數。 |
sum(&a, &b) | sum(int *a, int *b) | 同上,明確傳遞位址。 |
C 語言不支援 C++ 風格的參考型別(int &a),若在 C 程式碼中出現 int &a 會導致編譯錯誤。若需模擬傳引用行為,僅能使用指標參數。
#include
// 傳值版本:無法真正交換外部變數
void swap_by_value(int a, int b) {
int t = a; a = b; b = t;
}
// 傳址版本:可修改外部變數
void swap_by_address(int *a, int *b) {
int t = *a; *a = *b; *b = t;
}
int main() {
int x = 10, y = 20;
swap_by_value(x, y);
printf("傳值後: x=%d, y=%d\n", x, y); // 仍為 10, 20
swap_by_address(&x, &y);
printf("傳址後: x=%d, y=%d\n", x, y); // 變為 20, 10
return 0;
}
*ptr 存取並修改原變數。&),C 中 & 僅為取址運算子。