| 特性 | 指標 (T*) | 引用 (T&) |
|---|---|---|
| 可為空 | 是 (nullptr/0) | **否** — 必須綁定有效物件 |
| 初始化要求 | 可延遲、可不初始化 (危險) | **宣告即必須初始化**,且不可重新綁定 |
| 重新綁定 | 隨時可指向新物件 | **不可** — 永遠綁定初始目標 |
| 語法形式 | ptr->mem, *ptr | ref.mem (透明存取) |
| 記憶體佈局 | 獨立儲存位址 (通常 8 位元組) | **通常不佔儲存空間**,編譯器內部以指標實現但對程式碼透明 |
char* pc = nullptr;
char& rc = *pc; // 未定義行為!編譯器可能產生任意代碼
標準規定引用**必須指向合法物件**,違反即 UB。因此編譯器可假設引用永遠有效,**省略空檢查**,產生更緊湊代碼:
// 引用版:無分支
void printDouble(const double& d) { std::cout << d; }
// 指標版:需檢查
void printDouble(const double* p) { if (p) std::cout << *p; }
nullptr)operator[], operator*, operator=) → **必須用引用**
std::vector v(10);
v[5] = 10; // operator[] 回傳 int&,左值可賦值
// 若回傳 int*:需寫 *v[5] = 10; 語義不符預期
T& & → T&、T& && → T&、T&& & → T&、T&& && → T&&T&& 為**通用引用**,配合 std::forward 實現完美轉發。| 誤區 | 正確認知 |
|---|---|
| 引用只是「自動解參考的指標」 | 語義上引用**是物件的別名**,非物件本身;編譯器可優化掉儲存空間 |
const T& 延長臨時物件壽命 | 僅限**直接綁定**臨時值 (如 const int& r = 5;),不適用於函式回傳值鏈 |
| 引用傳遞比指標快 | 代碼生成通常相同;差異在**語義保證**而非指令數 |
const T& (唯讀)、T& (需修改);需表達「可選」時用 T* 或 std::optional<T> (C++17)。std::unique_ptr/shared_ptr 管理動態記憶體,僅在觀察者模式、非擁有關係下使用裸指標/引用。引用提供「不可空、不可重綁、透明存取」的強語義保證,讓介面意圖更清晰、編譯器優化更激進;指標保留「可空、可重綁、顯式解參考」的靈活性,適配動態記憶體與可選語義。善用二者語義差異,寫出更安全、更具表達力的 C++ 代碼。