函數參數為指針時,調用者傳遞的是指針本身,還是指針的副本?
#include <stdio.h>
void change1(int* d) {
printf("address_d = %p d = %p *d = %d\n", (void*)&d, (void*)d, *d);
int s = 4;
d = &s; // 修改形參指針指向
printf("address_d = %p d = %p *d = %d\n", (void*)&d, (void*)d, *d);
}
void change2(int *e) {
*e = 5; // 修改指針指向的值
}
int main() {
int *p = NULL, *q = NULL;
int a = 1;
while (a) {
scanf("%d", &a);
printf("address_a = %p a = %d\n", (void*)&a, a);
p = &a;
q = p;
printf("address_p = %p p = %p *p = %d\n", (void*)&p, (void*)p, *p);
printf("address_q = %p q = %p *q = %d\n", (void*)&q, (void*)q, *q);
change1(q);
printf("after change1: q = %p *q = %d\n", (void*)q, *q);
change2(q);
printf("after change2: a = %d, *q = %d, *p = %d\n", a, *q, *p);
}
return 0;
}
change1 中 d = &s 修改的是形參副本,不影響實參 qchange2 中 *e = 5 通過指針修改實參指向的內存,影響 a、*p、*q&d(形參地址)與 &q(實參地址)不同,證明傳遞的是副本d = ...)不影響調用者*d = ...)會影響調用者int **)調用棧: main: a=1 @0x7ffe... p=@a @0x7ffe... q=@a @0x7ffe... change1(d): d=@a (副本) @0x7ffe... → d=@s (修改副本) change2(e): e=@a (副本) @0x7ffe... → *e=5 (修改@a處內存)