void swap(char &a, char &b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
void swap(char *a, char *b) { // 參數是指針的副本
a = a ^ b; // 錯誤:指針地址異或,非解引用
b = a ^ b;
a = a ^ b;
}
void swap(char *a, char *b) {
*a = *a ^ *b; // 解引用操作數值
*b = *a ^ *b;
*a = *a ^ *b;
}
// 調用:swap(&x, &y);
| 特性 | 引用 (T&) | 指針 (T*) |
|---|---|---|
| 初始化 | 定義時必須綁定對象,不可為空 | 可為 nullptr,可延遲綁定 |
| 重綁定 | 不可,永遠指向初始對象 | 可隨時指向新地址 |
| 賦值語義 | 修改被引用對象的值 | 修改指針變量本身的地址值 |
| 語法糖 | 自動解引用,使用如普通變量 | 需顯式 * / -> 解引用 |
| 參數傳遞 | 調用方無感知,像值傳遞 | 調用方需取地址 & |
int x = 10, y = 20;
int *p = &x, *q = &y;
p = q; // p 指向 y,x 不變
*p = *q; // x 變為 20,y 不變
int &r = x, &s = y;
r = s; // x 變為 20,r 仍綁定 x
// 無法讓 r 綁定 y
void func(const BigObj &obj)p = q 改變指向,*p = *q 改變值引用是 C++ 引入的「別名機制」,本質是編譯器層面的自動解引用指針,但語義限制更嚴格,能防止大類指針誤用。理解兩者在參數傳遞中的異同,是寫出正確、安全 C++ 代碼的基礎。