【C++】21.函数传参 传指针和传引用的区别
指针传参
向函数传指针参数时,注意区分指针的指向(地址)
与 指针指向的地址中存放的值
的区别:
- 改变形参指针的指向,实参指针指向不会变,实参指向的地址存放的值也不会变;
- 改变形参指针指向的地址中存放的值,实参指针指向的地址中的值也会改变。
例1:改变形参指针的指向
例如,有个指针ptr1
指向变量a
。把ptr1
传给函数的一个形参指针ptr2
(这也是值传递,它所传递的是一个地址值)。如果在函数中将形参指针ptr2
指向了另外一个变量b
的地址,那也只是形参指针ptr2
的指向变了,不影响实参ptr1
。
void test(int *ptr2) {int c = 2;ptr2 = (&c);
}int main() {int a = 1;int *ptr1 = &a;test(ptr1);std::cout << "*ptr1= " << *ptr1 << std::endl; //结果是 1return 0;
}
可以看到,函数参数传了指针,形参指针改变指向,却并没有改变实参指针指向地址中的值。
例2:改变形参指针指向的地址中存放的值
下面这个传参传指针,但是函数中没有改变形参的指向,只改变了地址中的值,所以会改变实参指针指向地址中的值:
void test(int*ptr2){(*ptr2)=3;
}int main(){int a=1,b=2;int *ptr1=&a;test(ptr1);std::cout<< "*ptr1= " <<*ptr1<<std::endl; //结果是 3 return 0;
}
可以看到,函数参数传了指针,形参指针指向的地址中存放的值被修改了,(形参指针没有改变指向),实参指针指向地址中的值也被修改了。因为形参指针
和实参指针
都是指向
内存中同一块区域。
更详细的解释可参考:c++ 引用传参和指针传参的区别
指针参数传递:
- 指针参数传递本质上是值传递,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。值传递的特点是,被调函数对形式参数的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。
引用参数传递
引用参数传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别名找到主调函数中的本体)。因此,被调函数对形参的任何操作都会影响主调函数中的实参变量。
引用传递和指针传递是不同的,虽然他们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个
间接寻址
的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将应用不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量(地址),那就得使用指向指针的指针或者指针引用。从编译的角度来讲,程序在编译时分别将
指针
和引用
添加到符号表上,符号表中记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值(与实参名字不同,地址相同)。符号表生成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。
【C++】21.函数传参 传指针和传引用的区别相关推荐
- C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇
序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...
- 指针-数组传参,指针传参
目录 数组传参 一维数组 二维数组 指针传参 一级指针 二级指针 一个特殊的二级指针 数组传参 一维数组 我们把传入一维数组时输入的是数组名,数组名是一个指向首元素的指针 那么在函数接收时,只需要保证 ...
- 【C语言进阶】⑤关于数组传参和指针传参辨析
文章目录 一.数组 1.1.一维数组 1.2.二维数组 1.3.指针和数组 二.数组传参 2.1一维数组传参 2.2二维数组传参 2.3小结 三.指针传参 3.1一维指针传参 3.3二级指针传参 四. ...
- JS函数传参时:值传递与引用传递的区别
JS函数传参时:值传递与引用传递的区别 一.先分析基础数据与复杂数据的区别 : 基本数据类型:Undefined.Null.Boolean.Number.String 引用数据类型:对象 如:var ...
- 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的
python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...
- 论JS函数传参时:值传递与引用传递的区别
JS函数传参时:值传递与引用传递的区别? 值传递:值传递的数据为基本数据类型,基本数据类型在内存中存放的是数值本身:值传递为单向传递,只能由实参传递给形参. 引用传递:引用传递的数据为复杂数据类型,复 ...
- go语言传参是值传递还是引用传递
曾经在某次go面试中被面试官问到:"go中引用类型有哪些?",我答到:"slice,map,channel",面试官:"其实go没有引用类型,都是值类 ...
- 路由声明式传参和编程式传参
声明式传参(使用带href /或本质上是a标签的时候) 直接带路径里带携带参数 下例 在地址栏是可以看到参数的(querys传参) 在vue.tools插件里可以观察到 取出路径参数的方式 param ...
- vue 组件之间传值 父转子,子传父,同级别之间的传参,跨级别传参
写这篇文章之前,我对vue组件之间的传值,还是只知道一些基础的传值方式.虽然工作中勉强能够应对,但是想要行云流水感觉还是心有余而力不足,所以在此,我想总结一下vue组件之间的一些传值方式供大家参考,同 ...
- java void传参,Java中的传参
变量有两种类型根本类型和类类型 参数也是变量,所以传参分为 根本类型传参 类类型传参 过程1:根本类型传参 根本类型传参 在办法内,无法修改办法外的根本类型参数 publicclassHero{ St ...
最新文章
- 即使被拖库,也可以保证密码不泄露
- 文档生产工具 Doxygen
- Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究
- Linux下rgmii接口与fpga相连,FPGA控制RGMII接口PHY芯片88E1512网络通信
- 好玩的脚本代码大全_Github | 推荐一个Python脚本集合项目
- jfreechart createBarChart 去掉立体感
- 报错 hint: Updates were rejected because the remote contains work that you do 解决方法
- https配置的后序以及网页定位的测试
- 计算机考研408高分复习规划-如何复习408才能得高分
- 【游戏编程扯淡精粹】程序员的Windows技巧
- activiti 获取审批人员_activiti,根据任务id获取该任务节点配置的获选人或者获选组...
- Hadoop是什么,能干什么,怎么使用
- 2020 杭电多校5 1007、1008、1011
- vm装linux不能上网 系统,VM 安装Linux后,以前的系统无法上网
- Sharding-Jdbc分库分表集成Mybatis-Plus+多数据源管理
- 《数据结构实践》设计报告---迷宫求解
- 基于IMDB评论数据集的情感分析
- 2019-11-2-记一次调试资源管理器未响应经验
- python学英语视频教程_python教程(入门, 经典, 英文)
- 傲梅分区助手 去掉使用码
热门文章
- lucene源码分析(3)facet实例
- Lesson 13.2 模型拟合度概念介绍与欠拟合模型的结构调整策略
- Linux服务器Zookeeper+Dubbo环境搭建
- 关于Ping的TTL的含义
- 深入理解分布式技术 - 理论基石 CAP
- Spring5源码 - 01 BeanDefination源码分析
- 实战SSM_O2O商铺_27【商品类别】删除商品类别从Dao到View层的开发
- mysql性能优化教程_mysql性能优化教程
- 本地git存储库关闭_Git 入门:术语基础 | Linux 中国
- 系统优化怎么做-数据库优化