函數參數為指標時,調用者傳入的指標值會被複製(值傳遞)。函數內修改指標變數本身(指向新位址)不影響調用者的指標;但透過指標修改所指內容則會影響調用者。
#include <stdio.h>
void change1(int *d) { // 嘗試修改指標本身
printf("in change1: &d=%p, d=%p, *d=%d\n", &d, d, *d);
int s = 4;
d = &s; // 只改區域副本
printf("after d=&s: &d=%p, d=%p, *d=%d\n", &d, d, *d);
}
void change2(int *e) { // 修改指向的內容
*e = 5;
}
int main() {
int *p = NULL, *q = NULL;
int a = 1;
while (a) {
scanf("%d", &a);
printf("&a=%p, a=%d\n", &a, a);
p = &a; q = p;
printf("&p=%p, p=%p, *p=%d\n", &p, p, *p);
printf("&q=%p, q=%p, *q=%d\n", &q, q, *q);
change1(q);
printf("after change1: &q=%p, q=%p, *q=%d\n", &q, q, *q); // q 未變
change2(q);
printf("after change2: a=%d, *q=%d, *p=%d\n", a, *q, *p); // a 變為 5
}
return 0;
}
change1 內 d 的位址(&d)與 main 中 &q 不同,證明是副本。d = &s 只改變區域副本,返回後 q 仍指向 a。change2 透過 *e = 5 修改 a 的值,main 中 a、*p、*q 同步變為 5。
main: q ──────┐
│ ▼
└──► a (值 1)
change1: d (q 的副本) ──► a
d = &s 只改變 d 指向,不影響 q
change2: e (q 的副本) ──► a
*e = 5 修改 a 的值
int **)或回傳新指標。