T* 類型變量保存 T 對象地址,可加 const/volatile 限定符修飾指針本身T&,cv-qualifier 僅通過 typedef/template 引入且被忽略| 特性 | 指針 | 引用 |
|---|---|---|
| 可為空 | 是 (nullptr) | 否 (必須綁定有效對象) |
| 可重新綁定 | 是 | 否 (初始化後不可改變指向) |
| sizeof 結果 | 指針大小 (4/8 字節) | 所指對象大小 |
| 語法操作 | 需 * 解引用、& 取址 | 直接使用變量名,透明訪問 |
| 安全性 | 有空指針、野指針風險 | 無空引用、綁定後不可變,更安全 |
int i = 10;
int& ref = i;
ref++; // i 變 11
int j = 20;
ref = j; // 賦值操作,非重新綁定!i 變 20,j 不變
ref++; // i 變 21
// 輸出: i=21, ref=21, j=20
若為指針:ptr = &j 會改變指向,後續操作影響 j。
const int* p / int const* p:常量指針,**指向常量**,不可通過 *p 修改值int* const p:指針常量,**指針本身不可變**,需初始化,可通過 *p 修改值const int* const p:常量指針常量,雙重限定const int& ref:引用常量,不可通過 ref 修改值int& const ref (非法語法)int i = 1;
int& ref = i; // lea i地址 → eax; mov eax → ref存儲位置
int* p = &i; // lea i地址 → eax; mov eax → p存儲位置
結論:編譯器層面,引用本質是指針常量 (指針本身不可變,自動解引用)。引用佔用內存空間 (存儲地址),「引用不佔內存」是謬誤。
ptr = nullptr) 不影響主調函數若需通過指針修改主調函數的指針變量,必須傳 指針的指針 (T**) 或 指針的引用 (T*&)。
const,明確只讀意圖