void Exchg1(int x, int y) {
int tmp = x; x = y; y = tmp;
printf("x=%d, y=%d\n", x, y);
}
int main() {
int a=4, b=6;
Exchg1(a, b);
printf("a=%d, b=%d\n", a, b);
}
輸出:
x=6, y=4
a=4, b=6
解析:調用時隱含 int x=a; int y=b;,函數內操作副本,原變量 a,b 不變。
void Exchg2(int *px, int *py) {
int tmp = *px; *px = *py; *py = tmp;
printf("*px=%d, *py=%d\n", *px, *py);
}
int main() {
int a=4, b=6;
Exchg2(&a, &b);
printf("a=%d, b=%d\n", a, b);
}
輸出:
*px=6, *py=4
a=6, b=4
解析:傳遞地址,函數通過解引用直接修改原內存,實現真正交換。
void Exchg3(int &x, int &y) { // C++ 引用語法
int tmp = x; x = y; y = tmp;
printf("x=%d, y=%d\n", x, y);
}
int main() {
int a=4, b=6;
Exchg3(a, b);
printf("a=%d, b=%d\n", a, b);
}
輸出:
x=6, y=4
a=6, b=4
解析:引用是變量別名,語法上如值傳遞,語義上等同指針傳址。C 語言無此語法,需用指針模擬。
| 傳遞方式 | C 語法 | 函數內能否修改實參 | 本質 |
|---|---|---|---|
| 值傳遞 | func(int x) | 否 | 拷貝副本 |
| 地址傳遞 | func(int *p) | 是 | 傳遞指針,解引用修改 |
| 引用傳遞 | func(int &x) (C++) | 是 | 編譯器自動處理取址/解引用 |
// 1. 函數參數用指針
void swap(int *a, int *b) {
int t = *a; *a = *b; *b = t;
}
// 2. 調用時取地址
swap(&x, &y);
// 3. 輸出參數規範:const 輸入指針,非 const 輸出指針
void get_min_max(const int *arr, int n, int *min, int *max);
if (!ptr) return ERROR;。**p,修改指向內容傳 *p。const,防止誤修改並允許傳入常量。/* 值傳遞內存圖 */
main棧幀: a=4, b=6
Exchg1棧幀: x=4, y=6 ← 拷貝獨立副本
交換後: x=6, y=4 (main 的 a,b 不受影響)
/* 地址傳遞內存圖 */
main棧幀: a=4, b=6
Exchg2棧幀: px=&a, py=&b ← 存儲地址
*px=6, *py=4 ← 直接修改 main 棧幀內存
main 的 a,b 變為 6,4
ARM/x86-64 調用慣例前幾個參數通過寄存器傳遞(如 R0-R3 / RDI, RSI, RDX, RCX),屬於「值傳遞」的一種實現,但對指針參數同樣適用——寄存器存放地址值。理解調用慣例有優化性能關鍵路徑。