函数调用参数为指针时,实参跟形参的问题
#include<stdio.h>
void change(int *p){ int val = 5; printf("%p ", p); *p = val; printf("%p ", p); p = &val; printf("%p ", p); }
int main(){ int val = 4; int *p = &val; change(p); printf("%d ", *p); printf("%p ", 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 ", p); /**p = val; printf("%p ", p);*/ //去掉注释将发生read-only错误 p = &val; printf("%p ", p); }
运行结果: 0x7fff85402a94 0x7fff85402a7c 4 0x7fff85402a94
可以看出加上const之后,不能改变形参所指向的变量的值,但是可以改变形参的指向; 其实加上const就是说实参所指向的变量的值是只读的,形参不能改变;
void change(int *p){ int val = 5; printf("%p ", p); *p = val; printf("%p ", p); p = &val; printf("%p ", p); }
int main(){ int val = 4; int *p = &val; change(p); printf("%d ", *p); printf("%p ", 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 ", p); /**p = val; printf("%p ", p);*/ //去掉注释将发生read-only错误 p = &val; printf("%p ", p); }
运行结果: 0x7fff85402a94 0x7fff85402a7c 4 0x7fff85402a94
可以看出加上const之后,不能改变形参所指向的变量的值,但是可以改变形参的指向; 其实加上const就是说实参所指向的变量的值是只读的,形参不能改变;
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: php数组下标不为不连续的数字的问题
- 下一篇:没有了