首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言指標第六天學習筆記:從門牌號比喻到二級指標實戰

     編輯:關於C語言

C語言指標第六天學習筆記:從門牌號比喻到二級指標實戰

指標是 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)

三級、四級指標同理,只要記住「指標存放位址,位址指向的內容由型別決定」,層層遞進即可理解。

學習心法總結

  1. 畫記憶體圖:每個變數畫格子,標註位址、值、型別,箭頭連接指向關係。
  2. 分清「指標的值」vs「指向的值」:p 是位址,*p 是資料。
  3. 實際編譯執行:觀察位址數值(十六進制)、值的變化,驗證心智模型。
  4. 從簡單開始:一級指標 → 陣列指標 → 函數指標 → 多級指標 → 指標陣列 → 陣列指標。
  5. 遇到錯誤先問:這個指標指向哪?有沒有初始化?型別對不對?生命週期還在嗎?

指標的學習曲線陡峭,但一旦突破「位址即值」的認知門檻,就能自由操控記憶體、實現高效資料結構、理解系統底層運作。建議將上述代碼逐行敲入、單步除錯、畫圖記錄,建立屬於自己的指標直覺地圖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved