首页 > 编程语言 >77.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?

77.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?

时间:2023-07-11 15:24:11浏览次数:45  
标签:77 函数 主调 C++ 参数传递 地址 引用 指针

77.C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?

1.指针参数传递本质上是值传递,它所传递的是一个地址值。

值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。

值传递的特点是,被调函数对形式参数的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。

2.引用参数传递过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。

被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别名找到主调函数中的本体)。

因此,被调函数对形参的任何操作都会影响主调函数中的实参变量。

3.引用传递和指针传递是不同的,虽然他们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。

而对于指针传递的参数,如果改变被调函数中的指针地址,它将应用不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量(地址),那就得使用指向指针的指针或者指针引用。

4.从编译的角度来讲,程序在编译时分别将指针和引用添加到符号表上,符号表中记录的是变量名及变量所对应地址。

指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值(与实参名字不同,地址相同)。

符号表生成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

参考资料来源:

阿秀

标签:77,函数,主调,C++,参数传递,地址,引用,指针
From: https://www.cnblogs.com/codemagiciant/p/17544765.html

相关文章

  • 81.知道C++中的组合吗?它与继承相比有什么优缺点吗?
    81.知道C++中的组合吗?它与继承相比有什么优缺点吗?1.继承继承是Isa的关系,比如说Student继承Person,则说明StudentisaPerson。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。继承的缺点有以下几点:①父类的内部细节对子类是可见的。②子类从父类继承的方法......
  • PAT-甲级-1004 Counting Leaves C++
    Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetestcase.Eachcasestartswithalinecontaining 0<N<100,thenumberofnode......
  • Visual Studio C++ 相关使用技巧(持续更新)
    0.目的Startedin2023-07-1113:45:55记录VisualStudioC++的一些问题、配置步骤,用于提升效率。主要用VS2022版本,偶尔用VS2019。1.关闭inlayhints函数的参数前面,显示了类型。有时候感觉很碍眼。在VSCode里这称为inlayhints。在VS2022中文版本中,称为“启......
  • 动态数组和C++ std::vector详解
    目录1.std::vector2.vector的用法    2.1vector的定义和声明    2.2成员函数        2.2.1基本函数            operator=            assign            get_allocator        2.2.2元素访问   ......
  • C++进制转换+扫描线算法(二维区间合并面积和)
    ......
  • vue3中父组件与组件之间参数传递,使用(defineProps/defineEmits),涉及属性传递,对象传递,
    Vue3中子父组件之间的通信一、父组件传递参数到子组件采用defineProps传递属性父组件:<template><div><h1>这是父组件</h1><h1>父组件像子组件传递参数</h1><h2>传递属性值</h2><HH:fatherMessage="fatherMessage":valNum="valNum":valBool=......
  • C++面试八股文:用过std::set/std::map吗?
    C++面试八股文:用过std::set/std::map吗?某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:面试官:用过std::set/std::map吗?二师兄:用过。面试官:能介绍一下二者吗?二师兄:std::set是一个有序的集合,其中的元素是唯一的,即每个元素只能出现一次。一般用于去重和自动排序。......
  • 编程语言比拼之Java VS C++
    学Java还是C++?Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较:性能:C++通常被认为是一种更高效的编程语言,适用于对性能要求较高的应用程序,如游戏开发、嵌入式系统和高频交易等。C++具有更接近底层的控制能力,允许开发人员直接管理内存和硬件资源,以......
  • C++中set的用法学习
    Set是C++ STL(标准模板库)的一个容器类,它用于存储不同的值,并且可以按照特定顺序进行访问和操作。Set是C++STL(标准模板库)的一个容器类,它用于存储不同的值,并且可以按照特定顺序进行访问和操作。Set是一种基于红黑树实现的关联容器,也就是说它的元素按照固定的顺序排列,且每个元素都唯一......
  • 1003 Emergency C++
    Asanemergencyrescueteamleaderofacity,youaregivenaspecialmapofyourcountry.Themapshowsseveralscatteredcitiesconnectedbysomeroads.Amountofrescueteamsineachcityandthelengthofeachroadbetweenanypairofcitiesaremarke......