指针传参

向函数传指针参数时,注意区分指针的指向(地址)指针指向的地址中存放的值的区别:

  • 改变形参指针的指向,实参指针指向不会变,实参指向的地址存放的值也不会变;
  • 改变形参指针指向的地址中存放的值,实参指针指向的地址中的值也会改变。

例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.函数传参 传指针和传引用的区别相关推荐

  1. C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

    序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...

  2. 指针-数组传参,指针传参

    目录 数组传参 一维数组 二维数组 指针传参 一级指针 二级指针 一个特殊的二级指针 数组传参 一维数组 我们把传入一维数组时输入的是数组名,数组名是一个指向首元素的指针 那么在函数接收时,只需要保证 ...

  3. 【C语言进阶】⑤关于数组传参和指针传参辨析

    文章目录 一.数组 1.1.一维数组 1.2.二维数组 1.3.指针和数组 二.数组传参 2.1一维数组传参 2.2二维数组传参 2.3小结 三.指针传参 3.1一维指针传参 3.3二级指针传参 四. ...

  4. JS函数传参时:值传递与引用传递的区别

    JS函数传参时:值传递与引用传递的区别 一.先分析基础数据与复杂数据的区别 : 基本数据类型:Undefined.Null.Boolean.Number.String 引用数据类型:对象 如:var ...

  5. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的

    python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...

  6. 论JS函数传参时:值传递与引用传递的区别

    JS函数传参时:值传递与引用传递的区别? 值传递:值传递的数据为基本数据类型,基本数据类型在内存中存放的是数值本身:值传递为单向传递,只能由实参传递给形参. 引用传递:引用传递的数据为复杂数据类型,复 ...

  7. go语言传参是值传递还是引用传递

    曾经在某次go面试中被面试官问到:"go中引用类型有哪些?",我答到:"slice,map,channel",面试官:"其实go没有引用类型,都是值类 ...

  8. 路由声明式传参和编程式传参

    声明式传参(使用带href /或本质上是a标签的时候) 直接带路径里带携带参数 下例 在地址栏是可以看到参数的(querys传参) 在vue.tools插件里可以观察到 取出路径参数的方式 param ...

  9. vue 组件之间传值 父转子,子传父,同级别之间的传参,跨级别传参

    写这篇文章之前,我对vue组件之间的传值,还是只知道一些基础的传值方式.虽然工作中勉强能够应对,但是想要行云流水感觉还是心有余而力不足,所以在此,我想总结一下vue组件之间的一些传值方式供大家参考,同 ...

  10. java void传参,Java中的传参

    变量有两种类型根本类型和类类型 参数也是变量,所以传参分为 根本类型传参 类类型传参 过程1:根本类型传参 根本类型传参 在办法内,无法修改办法外的根本类型参数 publicclassHero{ St ...

最新文章

  1. 即使被拖库,也可以保证密码不泄露
  2. 文档生产工具 Doxygen
  3. Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究
  4. Linux下rgmii接口与fpga相连,FPGA控制RGMII接口PHY芯片88E1512网络通信
  5. 好玩的脚本代码大全_Github | 推荐一个Python脚本集合项目
  6. jfreechart createBarChart 去掉立体感
  7. 报错 hint: Updates were rejected because the remote contains work that you do 解决方法
  8. https配置的后序以及网页定位的测试
  9. 计算机考研408高分复习规划-如何复习408才能得高分
  10. 【游戏编程扯淡精粹】程序员的Windows技巧
  11. activiti 获取审批人员_activiti,根据任务id获取该任务节点配置的获选人或者获选组...
  12. Hadoop是什么,能干什么,怎么使用
  13. 2020 杭电多校5 1007、1008、1011
  14. vm装linux不能上网 系统,VM 安装Linux后,以前的系统无法上网
  15. Sharding-Jdbc分库分表集成Mybatis-Plus+多数据源管理
  16. 《数据结构实践》设计报告---迷宫求解
  17. 基于IMDB评论数据集的情感分析
  18. 2019-11-2-记一次调试资源管理器未响应经验
  19. python学英语视频教程_python教程(入门, 经典, 英文)
  20. 傲梅分区助手 去掉使用码

热门文章

  1. lucene源码分析(3)facet实例
  2. Lesson 13.2 模型拟合度概念介绍与欠拟合模型的结构调整策略
  3. Linux服务器Zookeeper+Dubbo环境搭建
  4. 关于Ping的TTL的含义
  5. 深入理解分布式技术 - 理论基石 CAP
  6. Spring5源码 - 01 BeanDefination源码分析
  7. 实战SSM_O2O商铺_27【商品类别】删除商品类别从Dao到View层的开发
  8. mysql性能优化教程_mysql性能优化教程
  9. 本地git存储库关闭_Git 入门:术语基础 | Linux 中国
  10. 系统优化怎么做-数据库优化