函数调用参数为指针时,实参跟形参的问题
2016-07-02 21:35
483 查看
#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就是说实参所指向的变量的值是只读的,形参不能改变;
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就是说实参所指向的变量的值是只读的,形参不能改变;
相关文章推荐
- 【腾讯优测干货分享】鹅厂专家详解Android N适配要点
- JS小瞰
- 研发年龄
- js构造函数的方法与原型prototype
- android产品研发(十六)-->开发者选项
- 命令模式 详解
- 模板替换的问题
- (转)笔试面试-转自一夜星辰的博客
- Java基础之(三) 函数
- Java中的随机数
- Android线性布局示例
- 如何在Linux下编译Cocos2dx3.11项目(主要是添加源文件喇~)
- TYVJ P1933 「Poetize3」绿豆蛙的归宿 数学期望DP
- [ArduPilot]Debian环境编译ArduCopter PX4固件
- 数据库更新操作的问题
- Java编码规范(常用重点)
- Java 集合系列09之 Map架构
- 中药处方
- jquery validate验证比较日期
- Mybatis步步进阶(四)——Mybatis框架流程及核心配置详解