int a, b;
int *p1 = &a, *p2 = &b, *temp;
if (a < b) { // 以 a,b 大小決定交換指標
temp = p1; // 暫存 p1 指向的地址
p1 = p2; // p1 指向 b
p2 = temp; // p2 指向 a
}
printf("%d,%d", *p1, *p2); // 輸出較大值在前
p1、p2 所持有的地址。*p1 等價於當前 p1 指向的變數值,透過指標間接訪問實現「邏輯交換」。qsort 排序指標陣列)。void swap(int *p1, int *p2) {
int temp = *p1; // 取得 p1 指向的值
*p1 = *p2; // 將 p2 指向的值寫入 p1 指向的位置
*p2 = temp; // 將暫存值寫入 p2 指向的位置
}
int main() {
int a, b;
scanf("%d,%d", &a, &b);
swap(&a, &b); // 傳遞地址
printf("%d,%d", a, b); // a、b 真實交換
}
| 維度 | 範例一 | 範例二 |
|---|---|---|
| 目的 | 邏輯上輸出有序,原變數不動 | 真實修改原變數值 |
| 操作對象 | 指標變數 (地址) | 指標指向的記憶體內容 |
| 函數簽名 | 無函數,主函數內直接操作 | void swap(int*, int*) |
| 適用場景 | 大型物件排序、多關鍵字索引 | 通用交換、輸出參數 |
int a = 10, b = 20; int *p1 = &a, *p2 = &b; 記憶體: a (0x1000): 10 b (0x1004): 20 p1 (0x2000): 0x1000 → a p2 (0x2004): 0x1004 → b 範例一交換後: p1 (0x2000): 0x1004 → b p2 (0x2004): 0x1000 → a *a, *b 值不變 範例二 swap(&a, &b) 後: a (0x1000): 20 b (0x1004): 10 p1, p2 未變(主函數內未使用指標變數)
*x vs x:x 是地址(指標值),*x 是該地址存儲的值(被指物件)。&a 取址:獲得變數在記憶體中的位置,賦予指標「導航能力」。void reassign(int **pp, int *new_target) {
*pp = new_target; // 解引用一次,修改原指標指向
}
int main() {
int x = 100, y = 200;
int *p = &x;
reassign(&p, &y); // 傳遞指標的地址
// 此時 p 指向 y
}
這是 C 語言模擬「引用」或「輸出指標參數」的標準模式,C++ 直接用 int* & 更直觀。
*p (值) 與 p (地址) 的二元對應,多畫記憶體圖、多寫 printf("%p", p) 觀察地址變化。