int inc(int x) { x++; return x; }
int main() {
int num = 1;
printf("%d\n", inc(num)); // 輸出 2
printf("%d\n", num); // 輸出 1,num 未變
return 0;
}
調用時隱含執行 int x = num;,操作的是副本。
int inc(int *p) { *p = *p + 1; return *p; }
int main() {
int num = 1;
printf("%d\n", inc(&num)); // 輸出 2
printf("%d\n", num); // 輸出 2,num 已被修改
return 0;
}
傳遞 &num,函數內 *p 直接操作原內存。
int inc(int *p) { return *p + 1; } // 僅讀取,未賦值
int main() {
int num = 1;
printf("%d\n", inc(&num)); // 輸出 2
printf("%d\n", num); // 輸出 1,未變
return 0;
}
傳址不代表一定修改,關鍵在於函數體是否對 *p 賦值。
int sum(int x, int y) { return x + y; } // x, y 為形參
int main() {
int i = 11;
i = sum(i, 22); // i, 22 為實參
printf("%d\n", i); // 33
return 0;
}
C 無原生引用,但傳址實現相同語義。C++ 引用 void swap(int &a, int &b) 語法更簡潔,本質仍是指針操作。
| 傳遞方式 | 語法 | 能否修改實參 | 典型用途 |
|---|---|---|---|
| 傳值 | func(int x) | 否 | 只讀輸入、小型結構體 |
| 傳址 | func(int *p) | 是 | 需修改實參、大型結構體、輸出參數 |
| 傳引用 | func(int &x) (C++) | 是 | C++ 首選,語法清晰 |
**p。