zoukankan      html  css  js  c++  java
  • 106、C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    服务器图片等资源在8080端口保存
    thinkphp 3.2.1 URL 大小写问题 下面有具体说明
    linux samba smb 在客户端无法连接使用
    php连接redis服务
    服务器死机 导致 mongo 挂掉
    同一个页面引用不同版本jquery库
    CSS3阴影 box-shadow的使用和技巧总结
    php 中使用正则
    Hbase-1.1.1-java API
    hive1.2.1问题集锦
  • 原文地址:https://www.cnblogs.com/crbhf/p/15004480.html
Copyright © 2011-2022 走看看