指針本質是存儲地址的變量。聲明 int *p, q; 中 p 是指針,q 是普通 int。p = &x 使 p 指向 x,*p 解引用獲取值。指針自身大小固定(32位系統 4 字節,64位 8 字節)。
void*void *y = &x;。(int*)y 或 *((int*)y) 獲取值。void* 表示通用指針,區別於返回 void(無返回值)。int **z = &p;,z 指向指針 p。*z 即 p(地址),**z 即 x(值)。這是動態二維數組的基礎:int **arr = new int*[rows]; 每行再 new int[cols]。
定義類型別名:typedef void (*pf)(int&, int*);。變量 pf f = swap; 可作為參數傳遞或返回。實現回調、策略模式的基礎。
& 與指針區別| 特性 | 指針 | 引用 |
|---|---|---|
| 重新綁定 | 可隨時指向新對象 | 初始化後不可更改(嫁雞隨雞) |
| 空值 | 可為 nullptr | 必須綁定有效對象,無空引用 |
| 內存實體 | 獨立變量,佔用指針大小 | 別名,不佔用額外內存(sizeof(ref) 為對象大小) |
| 安全性 | 靈活但易出錯(野指針、懸空指針) | 編譯器保證有效性,更安全 |
| 返回動態內存 | 適用(返回指針) | 不適用(引用掛在棧上,易內存洩漏) |
引用是編譯器層面的語法糖,底層實現通常即指針。但引用限制了操作(不可重綁定、不可為空),消除了指針常見錯誤,應優先使用引用,僅在需動態綁定、可空、或操作裸內存時用指針。