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

C語言指標運算子與指標運算式:解參考、位址運算、指標交換與函數參數傳遞實戰

     編輯:關於C語言

兩大核心指標運算子

運算子名稱功能
&位址運算子&m 取得變數 m 的記憶體位址
*間接運算子(解參考)*ptr 存取 ptr 指向的變數值

範例 1:透過指標交換兩數值(數值交換)

main() {
    int *p1, *p2, a, b, t;
    scanf("%d,%d", &a, &b);
    p1 = &a; p2 = &b;
    if (*p1 < *p2) {
        t = *p1; *p1 = *p2; *p2 = t;  // 交換所指變數的值
    }
    printf("%d,%d\n", a, b);
}

輸入 3,4 → 輸出 4,3。指標 p1、p2 指向固定,交換的是記憶體中的資料。

範例 2:透過交換指標指向達成相同效果(指標交換)

main() {
    int *p1, *p2, a, b, *t;
    scanf("%d,%d", &a, &b);
    p1 = &a; p2 = &b;
    if (*p1 < *p2) {
        t = p1; p1 = p2; p2 = t;  // 交換指標本身的指向
    }
    printf("%d,%d\n", *p1, *p2);
}

結果相同,但記憶體資料未移動,改變的是指標指向。此法在大型資料結構(如結構體陣列)排序時極具效率優勢。

指標變數作函數參數

傳遞指標給函數,實質傳遞的是變數位址,函數內可透過位址修改原變數,實現「參考呼叫」效果。

正確範例:函數內交換數值

void chang(int *pt1, int *pt2) {
    int t;
    if (*pt1 < *pt2) {
        t = *pt1; *pt1 = *pt2; *pt2 = t;  // 修改記憶體資料
    }
}

main() {
    int *p1, *p2, a, b;
    scanf("%d,%d", &a, &b);
    p1 = &a; p2 = &b;
    chang(p1, p2);  // 傳遞指標(位址)
    printf("%d,%d\n", *p1, *p2);
}

形參 pt1、pt2 接收實參 p1、p2 的值(位址),指向相同記憶體,修改生效於呼叫端。

錯誤範例:函數內交換指標指向(無效)

void chang(int *pt1, int *pt2) {
    int *t;
    if (*pt1 < *pt2) {
        t = pt1; pt1 = pt2; pt2 = t;  // 僅修改區域指標副本
    }
}

形參為指標的副本,函數內交換指向不影響呼叫端的 p1、p2,故輸出與輸入相同。

關鍵心法

  • 要修改呼叫端變數:函數需接收該變數的位址,並在函數內解參考後修改值(*ptr = 新值)。
  • 函數內修改指標本身(如 ptr = 新位址)僅影響區域副本,除非傳遞指標的指標(**ptr)。
  • 圖解記憶體關係是除錯指標邏輯的最強工具。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved