#include<stdio.h>
void change(int *p){
int val = 5;
printf("%p\n", p);
*p = val;
printf("%p\n", p);
p = &val;
printf("%p\n", p);
}
int main(){
int val = 4;
int *p = &val;
change(p);
printf("%d\n", *p);
printf("%p\n", p);
return 0;
}
运行结果:
0x7fffdb8192a4
0x7fffdb8192a4
0x7fffdb81928c
5
0x7fffdb8192a4
可以看出,实参跟形参是两个不同的指针,只不过进入函数时,实参跟形参都指向main函数中的val地址,
当改变形参指向的变量的值时,*p = val; main函数中的val被改变;
但是改变形参的指向地址时,p = &val; 只是改变了形参的指向,并没有改变实参的指向;
当加上const之后:
void change(const int *p){
int val = 5;
printf("%p\n", p);
/**p = val;
printf("%p\n", p);*/ //去掉注释将发生read-only错误
p = &val;
printf("%p\n", p);
}
运行结果:
0x7fff85402a94
0x7fff85402a7c
4
0x7fff85402a94
可以看出加上const之后,不能改变形参所指向的变量的值,但是可以改变形参的指向;
其实加上const就是说实参所指向的变量的值是只读的,形参不能改变;