【问题标题】:Pass by pointer & Pass by reference [duplicate]按指针传递和按引用传递[重复]
【发布时间】:2012-01-24 03:48:26
【问题描述】:

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

【问题讨论】:

标签: c++ pointers reference parameter-passing


【解决方案1】:

引用在语义上如下:

T&amp; &lt;=&gt; *(T * const)

const T&amp; &lt;=&gt; *(T const * const)

T&amp;&amp; &lt;=&gt; [no C equivalent] (C++11)

与其他答案一样,C++ 常见问题解答中的以下内容是单行答案:尽可能引用,需要时提供指针。

优于指针的一个优点是您需要显式转换才能传递 NULL。 不过,这仍然是可能的。 在我测试过的编译器中,没有一个会发出以下警告:

int* p() {
    return 0;
}
void x(int& y) {
  y = 1;
}
int main() {
   x(*p());
}

【讨论】:

  • 引用不限制引用对象引用有效的东西。例如,您可以返回对局部变量的引用。
  • 如果取消引用 NULL 指针,可能会得到无效引用,因此在调用代码中仍需小心。见stackoverflow.com/questions/57483/…
  • 这是可能的,但除非你取消引用未经检查的指针,否则它不应该发生。如果您在取消引用之前不检查指针,那么我有消息要告诉您...
  • @moshbear,这是我必须艰难学习的一课。它甚至不是我的代码!
  • 我简化了我的回答,并举了一个臭名昭著的空引用的例子。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      始终使用引用,仅当您必须引用无法引用的 NULL 时才使用指针。

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

      【讨论】:

      • int&amp; x = *static_cast&lt;int*&gt;(NULL);。就是这样。
      【解决方案5】:

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

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

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

      在没有充分理由不这样做的任何情况下,都希望提供参考。如果可以,请设为const

      【讨论】:

        猜你喜欢
        • 2013-12-02
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 2016-12-25
        • 2019-05-07
        相关资源
        最近更新 更多