指標是 C 語言最靈活也最難掌握的部分。本文以初學者視角,用「倉庫門牌號」比喻建立直覺,逐步實作指標定義、取址、解引用、指標交換、多級指標,並記錄實際執行結果圖解,適合作為入門筆記參考。
&a = 找到 a 這間倉庫的門牌號*p = 憑門牌號找到倉庫,拿裡面的貨物#include <stdio.h>
int main() {
int a;
scanf("%d", &a);
while (a--) {
int *p;
p = &a;
printf("%d--", *p); // 輸出 p 指向的值 (a 的值)
printf("%d\n", p); // 輸出 p 本身的值 (a 的位址)
}
return 0;
}
執行結果觀察:每次迴圈 *p 輸出遞減的 a 值,p 輸出固定的位址。證實指標確實存放位址,且位址不隨值改變。
printf("%d--", &p); // 輸出指標變數 p 本身的位址
關鍵發現:指標本身也是變數,佔用記憶體空間,有自己的位址。這為多級指標鋪路。
* 與 & 雙重身份總結| 符號 | 宣告時 | 表達式中 |
|---|---|---|
* | 宣告指標型別 int *p; | 解引用:取得指向位址的值 *p |
& | 無 | 取址:取得變數位址 &a |
#include <stdio.h>
int main() {
int a, b;
int *p, *q, *w; // 三個指標
scanf("%d%d", &a, &b);
p = &a; // p 指向 a
q = &b; // q 指向 b
printf("交換前: %d %d\n", *p, *q); // 透過指標輸出值
// 僅交換指標指向,不動實際變數
w = p;
p = q;
q = w;
printf("交換指標後: %d %d\n", *p, *q); // 輸出交換後的值
printf("原變數: %d %d\n", a, b); // a,b 本身未變
printf("指標值: %d %d\n", p, q); // p,q 現在指向對方
return 0;
}
輸出結果:指標交換後,*p 輸出原 b 值,*q 輸出原 a 值,但 a、b 實際記憶體內容未變。這展示「指標操作位址,不直接搬移資料」的特性。
int a = 10; int *p = &a; // 一級指標 int **q = &p; // 二級指標:指向一級指標的位址 // 關係鏈: // q (位址) → p (位址) → a (值 10) // 解引用: *q 等價於 p (位址) **q 等價於 *p 等價於 a (值 10)
三級、四級指標同理,只要記住「指標存放位址,位址指向的內容由型別決定」,層層遞進即可理解。
p 是位址,*p 是資料。指標的學習曲線陡峭,但一旦突破「位址即值」的認知門檻,就能自由操控記憶體、實現高效資料結構、理解系統底層運作。建議將上述代碼逐行敲入、單步除錯、畫圖記錄,建立屬於自己的指標直覺地圖。