指針是變量,專門用來存儲地址的變量。 通過 & 運算符獲取變量首地址,地址帶有類型信息:
char val; &val 類型為 char*int val; &val 類型為 int*int* p; &p 類型為 int**編譯器會自動檢查類型匹配,不匹配報警;可用強制轉換 (char*)&val 消除警告。
* 的精確語義*地址A:從地址 A 起始,向後讀取「地址類型所佔字節數」個字節。
int* p = 0x0012FF7C → *p 讀取 4 字節(0x0012FF7C~0x0012FF7F)char* p = 0x0012FF7C → *p 僅讀取 1 字節(0x0012FF7C)類型決定讀取寬度,這是指針運算的核心邏輯。
int val = 12;
int *p = &val;
int **pp = &p;
int ***ppp = &pp;
printf("%d %d %d %d\n", val, *p, **pp, ***ppp); // 全部輸出 12
內存佈局關係:
| 層級 | 變量 | 值(地址) | 指向 |
|---|---|---|---|
| 0 | val | 0x0012FF7C | 數據 12 |
| 1 | p | 0x0012FF78 | &val (0x0012FF7C) |
| 2 | pp | 0x0012FF74 | &p (0x0012FF78) |
| 3 | ppp | 0x0012FF70 | &pp (0x0012FF74) |
***ppp 逐層解引用:ppp → pp → p → val,完美驗證地址鏈。
int val = 1;
char firstByte = *(char*)&val; // 取 val 首字節
if (firstByte == 1) printf("小端模式\n");
else if (firstByte == 0) printf("大端模式\n");
利用 int 佔 4 字節,小端模式最低地址存最低有效位(1),大端模式存最高有效位(0)。
指針理論已夠扎實,但「指針有什麼用?」答案在函數參數傳遞、動態內存、數據結構中。下一講深入棧幀與函數調用機制,揭開指針實戰威力的序幕。