看下面的程序:(编译器:C-Free 5.0)
#include <stdio.h>
int b = 10;
void fun(int *p) {
(*p)++;
printf("函数调用之后,指针变量p被保存在地址为%d的内存空间里\n", &p);
p = &b;
}
int main() {
int a = 1;
int *p = &a;
printf("函数调用之前,指针变量p被保存在地址为%d的内存空间里\n" ,&p);
printf("函数调用之前,指针变量p指向的内存空间的地址为:%d\n", p);
fun(p);
printf("函数调用之后,指针变量p指向的内存空间的地址为:%d\n", p);
}
打印结果:
从上面的运行结果来看,得出以下结论:
1.在主函数中的指针变量p和在被调函数中的指针变量p是分开的、独立的,分别隶属于不同的内存存储单元。只是两个指针变量存储的值相同而已,并不是共享同一个指针变量p,所以像这样的形参为指针变量的函数调用,本质上还是"值传递"-------系统从主调者那里复制相应的指针变量值给了被调函数的形参罢了,只不过这个"值传递"传递的'值'是个地址罢了;
2.在被调函数中试图修改主函数中指针变量p的指向,但从结果看,显然失败了。这一点更加证明了结论1的正确性。