| 運算子 | 名稱 | 功能 |
|---|---|---|
& | 位址運算子 | &m 取得變數 m 的記憶體位址 |
* | 間接運算子(解參考) | *ptr 存取 ptr 指向的變數值 |
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 指向固定,交換的是記憶體中的資料。
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)。