代码之家  ›  专栏  ›  技术社区  ›  Ahmed

函数C++中的指针传递与引用传递(复制)

  •  0
  • Ahmed  · 技术社区  · 6 年前

    可能重复:
    What are the differences between pointer variable and reference variable in C++?
    Are there benefits of passing by pointer over passing by reference in C++?

    在这两种情况下,我都取得了结果。 那么什么时候一个比另一个更受欢迎呢?我们为什么要用一个来代替另一个?

    #include <iostream>
    using namespace std;
    void swap(int* x, int* y)
    {
        int z = *x;
        *x=*y;
        *y=z;
    }
    void swap(int& x, int& y)
    {
        int z = x;
        x=y;
        y=z;
    }
    
    int main()
    {
        int a = 45;
        int b = 35;
        cout<<"Before Swap\n";
        cout<<"a="<<a<<" b="<<b<<"\n";
    
        swap(&a,&b);
        cout<<"After Swap with pass by pointer\n";
        cout<<"a="<<a<<" b="<<b<<"\n";
    
        swap(a,b);
        cout<<"After Swap with pass by reference\n";
        cout<<"a="<<a<<" b="<<b<<"\n";
    }
    

    产量

    Before Swap
    a=45 b=35
    After Swap with pass by pointer
    a=35 b=45
    
    After Swap with pass by reference
    a=45 b=35
    
    0 回复  |  直到 8 年前
        1
  •  26
  •   moshbear    8 年前

    引用的语义如下:

    T& <=> *(T * const)

    const T& <=> *(T const * const)

    T&& <=> [no C equivalent] (C++ 11)

    与其他答案一样,下面的C++ FAQ是一行答案:可能的引用,需要时的指针。

    与指针相比,它的一个优点是需要显式转换才能传递null。 不过,这还是有可能的。 在我测试过的编译器中,没有一个会发出以下警告:

    int* p() {
        return 0;
    }
    void x(int& y) {
      y = 1;
    }
    int main() {
       x(*p());
    }
    
        2
  •  6
  •   user529758    11 年前

    事实上,大多数编译器为两个函数调用发出相同的代码,因为引用通常使用指针实现。

    按照这种逻辑,当在函数体中使用(非const)引用类型的参数时,生成的代码将仅对参数的地址进行静默操作,并取消对它的引用。此外,当遇到对此类函数的调用时,编译器将生成传递参数地址的代码,而不是复制其值。

    基本上,引用和指针没有太大的不同 从实现的角度来看, 主要(也是非常重要的)区别在于哲学: 引用就是对象本身, 只是换个名字而已。

    与指针相比,引用有更多的优点(例如,它们不能 NULL ,所以使用起来更安全)。因此,如果你可以使用C++,那么通过引用通常被认为更优雅,应该是首选。但是,在C中,没有引用传递,因此,如果你想编写C代码(或者,HyrRixDICTU,用C和C++编译器编译的代码,尽管这不是一个好主意),你就必须限制自己使用指针。

        3
  •  4
  •   Mark Ransom    13 年前

    pass by pointer是在c中传递“by reference”的唯一方法,所以您仍然可以看到它使用了很多。

    空指针是表示参数未使用或无效的方便约定,因此在这种情况下使用指针。

    引用一旦设置就无法更新,因此如果需要重新分配,请使用指针。

    在没有充分理由不做的情况下,最好找一个推荐人。成功 const 如果可以的话。

        4
  •  4
  •   seaotternerd    10 年前

    Here 这是一篇很好的文章-“尽可能使用引用,必要时使用指针。”

        5
  •  2
  •   Sanish    13 年前

    始终使用引用,只有在必须引用时才使用指针 NULL 哪个引用不能引用。

    请参阅以下常见问题解答: http://www.parashift.com/c++-faq-lite/references.html#faq-8.6