指針是 C 語言的靈魂,理解指針的前提是理解 **變量在內存中如何存儲**。本文用「電影院座位」類比,從內存編址、變量聲明映射、賦值本質、取址操作四個維度,建立指針學習的堅實心智模型。
內存地址 → 6 7 8 9 10 11 12 13
┌───┬───┬───┬───┬───┬───┬───┬───┐
數據區 │ │ │ │ │ │ │ │ │ ...
└───┴───┴───┴───┴───┴───┴───┴───┘
int i; // 申請 2 字節 (假設 16 位 int),命名為 i
char a; // 申請 1 字節,命名為 a
內存映射示例 (假設 i 從地址 6 開始,a 從 8 開始):
內存地址 → 6 7 8 9 10 11 12 13
┌───┬───┬───┬───┬───┬───┬───┬───┐
數據區 │ i (2 bytes) │ a (1 byte) │ │ ...
└───┴───┴───┴───┴───┴───┴───┴───┘
變量名 ← i → ← a →
int 寬度因平台而異 (16/32/64 位系統分別為 2/4/8 字節)
i = 30; // 將 30 的二進制表示寫入 i 佔用的 2 字節
a = 't'; // 將 't' 的 ASCII 碼 (116) 寫入 a 佔用的 1 字節
內存地址 → 6 7 8 9 ...
┌───────┬───┐
數據區 │ 30 │'t'│ ...
└───────┴───┘
& = 詢問「座位號」
&i // 返回變量 i 的起始內存地址 (上例中為 6)
& 是**一元運算符**,只能作用於**左值** (有地址的對象)printf("%p", &i); 打印地址 (用 %p 格式,非 %d)
#include
int main() {
int i = 39;
printf("i 的值: %d\n", i); // ① 輸出 39
printf("i 的地址: %p\n", (void*)&i); // ② 輸出類似 0x7ffd12345678
return 0;
}
關鍵區別:
i 代表 **存儲在內存中的數值**&i 代表 **該數值存放的內存位置編號**char c = 'A'; 佔用幾字節?地址範圍?int arr[3] = {1,2,3}; 數組名 arr 代表什麼地址?&i 不能出現在賦值號左邊?正式進入指針世界:**指針變量聲明、初始化、解引用 *、指針算術、指針與數組的深度綁定關係** — 從「知道座位號」到「憑座位號找人、移動座位、操作數據」。