关于C++:指针传递与引用传递

Pass by pointer & Pass by reference

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
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++?

在这两种情况下,我都取得了成果。那么什么时候一个比另一个更受欢迎呢?我们用一个比另一个的原因是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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
"
;
    cout<<"a="<<a<<" b="<<b<<"
"
;

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

    swap(a,b);
    cout<<"After Swap with pass by reference
"
;
    cout<<"a="<<a<<" b="<<b<<"
"
;
}

产量

1
2
3
4
5
6
7
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是一行答案:可能的引用,需要时的指针。

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

1
2
3
4
5
6
7
8
9
int* p() {
    return 0;
}
void x(int& y) {
  y = 1;
}
int main() {
   x(*p());
}


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

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

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

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


这里有一篇关于这个问题的好文章-"尽可能使用引用,必要时使用指针。"


pass-by指针是在C语言中传递"by-reference"的唯一方法,因此您仍然可以看到它使用了很多。

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

一旦设置了引用,就不能更新它们,所以如果需要重新分配它,请使用指针。

在没有充分理由不推荐的情况下,最好是推荐信。如果可以的话,把它改成1〔3〕。


只有当你必须引用NULL时,才使用所有的引用和指针,而引用不能引用NULL时。

请参阅此常见问题解答:http://www. PARASIFIF.COM/C++-FAQLIT/Realth.html