C++ 通过指针&;参照

C++ 通过指针&;参照,c++,pointers,reference,parameter-passing,C++,Pointers,Reference,Parameter Passing,可能重复: 在这两种情况下,我都取得了成功。 那么什么时候一个比另一个更受欢迎呢?我们使用其中一个的原因是什么 #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 ma

可能重复:

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

#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";
}

引用在语义上如下所示:

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

const T&*(T const*const)

T&[没有C等价物]
(C++11)

与其他答案一样,C++中的FAQ是一行答案:可能时引用,需要时指针。< /P> 与指针相比的一个优点是需要显式强制转换才能传递NULL。 不过,这仍然是可能的。 在我测试过的编译器中,没有一个会发出以下警告:

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

在C中,通过指针传递是“通过引用”传递的唯一方法,因此您仍然可以看到它被大量使用

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

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


在没有很好的理由不推荐的情况下,请选择推荐人。如果可以,将其设为const。

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

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

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


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

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

请参阅此常见问题解答:

是一篇关于这一问题的好文章——“在可能的时候使用引用,在必须的时候使用指针。”

引用不会将引用对象限制为引用有效的对象。例如,您可以返回对局部变量的引用。如果取消引用空指针,则可能会得到无效引用,因此在调用代码时仍需小心。看,这是可能的,但除非您取消对未检查指针的引用,否则它不应该发生。如果你在解引用指针之前不检查指针,那么我有消息告诉你…@moshbear,这是我必须以艰苦的方式学习的一课。甚至不是我的密码!我简化了我的答案,并给出了一个臭名昭著的null引用的例子。仅此而已。