通过指针传递和通过引用传递

可能重复:
C ++中指针变量和引用变量之间有什么区别?
在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 Swapn";
    cout<<"a="<<a<<" b="<<b<<"n";

    swap(&a,&b);
    cout<<"After Swap with pass by pointern";
    cout<<"a="<<a<<" b="<<b<<"n";

    swap(a,b);
    cout<<"After Swap with pass by referencen";
    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

一个引用在语义上如下:

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

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

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

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

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


通过指针传递是你可以在C中通过“引用”传递的唯一方式,所以你仍然会看到它被使用了很多。

NULL指针是一个方便的约定,用于表示参数未被使用或无效,所以在这种情况下使用指针。

引用无法在设置后更新,因此如果您需要重新分配引用,请使用指针。

在没有充分理由的情况下,请选择参考。 如果可以的话,使它成为const

链接地址: http://www.djcxy.com/p/20713.html

上一篇: Pass by pointer & Pass by reference

下一篇: Why can't static methods be abstract in Java