通过指针&通过引用传递

时间:2011-12-20 05:11:36

标签: c++ pointers reference parameter-passing

  

可能重复:
  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

5 个答案:

答案 0 :(得分:26)

引用在语义上如下:

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());
}

答案 1 :(得分:6)

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

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

基本上,从实现的角度来看,引用和指针并没有太大差异 主要(非常重要)的区别在于哲学:引用是对象本身,< / strong>只是用不同的名字。

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

答案 2 :(得分:4)

传递指针是你在C中传递“by reference”的唯一方法,所以你仍然会看到它使用了很多。

NULL指针是一个方便的约定,用于说参数未使用或无效,因此在这种情况下使用指针。

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

在没有充分理由的情况下,请优先参考。如果可以,请将其设为const

答案 3 :(得分:4)

Here是一篇关于此事的好文章 - “尽可能使用引用,并在必要时使用引用。”

答案 4 :(得分:2)

仅在必须引用NULL哪个引用无法引用时才使用引用。

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