指針是C語言的靈魂,也是許多初學者感到困惑的關鍵點。本文將系統梳理指針的本質、定義、運算及常見陷阱,助你建立清晰的指針思維模型。
內存中的每個字節都有一個唯一的編號,我們稱之為內存地址。這些地址按字節連續編址。C語言中,我們習慣將內存地址稱為指針。理解這一點至關重要:指針本質上就是一個內存地址。
程序訪問內存有兩種方式:
int a = 20; 中,對 a 賦值或取值即是直接訪問。&(取地址符):獲取變量的內存地址。*(解引用/間接訪問符):訪問指針指向地址處的數據。%p:用於 printf 打印地址。int a = 20;
int *p = &a; // 定義指針變量 p,存儲 a 的地址
printf("%d", *p); // 通過 *p 獲取 a 的值(20)
注意:定義時的 * 僅作聲明用,告訴編譯器 p 是一個存放地址的變量。
雖然所有指針變量在同一平台上大小相同(32位系統4字節,64位系統8字節),但指針類型決定了解引用時讀取的字節數和解釋方式:
int *p:讀取4字節並按整型解釋char *p:讀取1字節並按字符解釋double *p:讀取8字節並按雙精度浮點數解釋int *p; p++; 使地址增加 sizeof(int) 字節。>, <, ==, != 比較。NULL。NULL。malloc/free)。有符號整數在內存中以補碼形式存儲:正數補碼即原碼;負數補碼 = 符號位不變,其餘位取反,最後加1。這是理解整型範圍和溢出行為的基礎。
掌握指針,關鍵在於建立「地址+類型」的二維認知:地址定位在哪裡,類型定義怎麼讀。多動手調試觀察內存布局,指針不再是攔路虎,而是手中的利刃。