【C++基础部分】我们常说的 引用传递,指针传递,值传递,分别指什么呢?你觉得他们有啥区别呢?

本问题对应文章链接:C++常见面试题整理

共以下 3 个回答

  • Thaddeus 永久会员 2023年9月14日 下午5:06
    引用传递、指针传递和值传递是函数参数传递的三种不同方式,它们有以下的定义和区别

    1.引用传递

    • 通过引用传递参数,传递的是实参的地址,形参就是传入的实参
    • 函数内对形参的修改会直接反映到实参上。
    • 引用传递可以避免实参的拷贝,节省内存空间和提高性能。

    2.指针传递

    • 通过指针传递参数,传递的是实参的地址,形参为指向实参地址的指针。
    • 函数内对形参的修改会改变指针所指向的值。
    • 本质上仍然是pass by value,它所传递的是一个地址值

    3.值传递

    • 通过值传递参数,形参本质上是调用实参类型的拷贝构造函数对实参拷贝的一个副本。
    • 实参的地址与形参的地址不相同,函数内对形参的修改不会改变实参的值。
    0 赞同 0 条回复
  • shuaidi 永久会员 2023年7月4日 下午12:48

    引用传递:引用传递是C++中特有的函数参数传递方式,当然在C语言中也有使用。主要是通过将引用作为函数参数进行传递,在函数调用时,系统会将函数的实参的地址复制给函数的形参,在函数内部对形参的修改会影响实参的值。这个过程就避免了较大数据的拷贝,因此一般参数是较大类的对象时,要使用引用传递。

    void swap(int &a,int &b){
    int tmp=a;
    a=b;
    b=tmp;
    }
    
    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年7月1日 下午9:26

    在C++中,引用传递、指针传递和值传递是参数传递的三种方式。

    1. 引用传递:引用传递是C++中特有的函数参数传递方式,当然在C语言中也有使用。主要是通过将引用作为函数参数进行传递,在函数调用时,系统会将函数的实参的地址复制给函数的形参,在函数内部对形参的修改会影响实参的值。这个过程就避免了较大数据的拷贝,因此一般参数是较大类的对象时,要使用引用传递。
      “`cpp
      void swap(int &a,int &b){
      int tmp=a;
      a=b;
      b=tmp;
      }
      “`

    2. 指针传递:通过将指针作为函数参数传递,可以在函数内部通过指针操作原始数据。使用指针传递可以让函数接收任意类型的数据,并可以在函数内部进行动态内存分配。在函数调用时,系统会将函数的实参的地址复制给函数的形参,在函数内部对形参的修改会影响实参的值。

      “`c++
      void swap(int *a,int *b){
      int tmp=*a;
      *a=*b;
      *b=tmp;
      }
      “`

    3. 值传递:是指将实参的值拷贝给形参,这个传递是单向的,函数内部对形参进行操作不会影响原始数据。

      “`C++
      void swap(int a,int b){
      int tmp=a;
      a=b;
      b=tmp;
      } //进行swap失败了,调用这个函数不会将数据交换成功
      “`

    不同之处:

    1. 这三种传递方式的区别主要体现在对原始数据的访问和修改方式上,以及对数据的拷贝与否,对性能和效率的影响。选择哪种传递方式取决于具体的需求和情况。
    2. 引用传递避免了较大数据的拷贝,因此一般参数是较大类的对象时,要使用引用传递;但是值传递恰恰相反,对大型结构体或类对象进行值传递可能会导致较大的性能开销,因为需要进行数据的复制。
    3. 引用传递和指针传递在效果上可能类似,在实现上有以下不同:引用传递不允许指向空值,而指针传递可以传递空指针(但是不建议这样,因为空指针可能会导致一些错误);如果对性能有要求,传递大型对象时可以使用引用传递,避免拷贝的开销。
    0 赞同 0 条回复

# 回答此问题

后才能回答