C++ 中 & 有兩種截然不同的用途:
int a = 5;
int *p = &a; // p 保存 a 的記憶體位址
int a = 5;
int &b = a; // b 是 a 的別名,兩者共用同一記憶體
驗證位址相同:
#include <iostream>
using namespace std;
int main() {
int a = 5;
int &b = a;
cout << "&a = " << &a << endl;
cout << "&b = " << &b << endl; // 輸出相同位址
return 0;
}
| 特性 | 指標 | 參考 |
|---|---|---|
| 語法 | int *p = &a; | int &r = a; |
| 存取值 | *p | r (直接) |
| 可重新綁定 | 是 | 否 (初始化後固定) |
| 可為 null | 是 | 否 (必須綁定有效物件) |
| 記憶體開銷 | 指標大小 | 通常無額外開銷 (編譯器優化) |
| 類別成員存取 | p->Member() | r.Member() |
class Human {
public:
void Talk() { cout << "Hello" << endl; }
};
int main() {
Human h;
Human *p = &h; // 指標
Human &h1 = h; // 參考
p->Talk(); // 指標呼叫
(*p).Talk(); // 解參考呼叫
h1.Talk(); // 參考直接呼叫 (更簡潔)
cout << "h 位址: " << &h << endl;
cout << "p 位址: " << p << endl;
cout << "h1 位址: " << &h1 << endl; // 三者相同
}
void Swap(int &a, int &b) { // 無需在呼叫端加 &
int t = a; a = b; b = t;
}
int &GetElement(int *arr, int i) { return arr[i]; }
GetElement(arr, 3) = 10; // 直接修改陣列元素
class MyClass {
int &m_Ref;
public:
MyClass(int &var) : m_Ref(var) {} // 僅此處可初始化
};
& 前置於型別/變數名之間 → 參考宣告 (別名)& 前置於單一變數前 → 取址運算子 (位址值)