在这两种情况下,我都取得了成果。那么,哪一种优先于另一种?我们用一个而不是另一个的原因是什么?
#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发布于 2011-12-20 05:15:54
引用在语义上如下:
T& <=> *(T * const)
const T& <=> *(T const * const)
T&& <=> [no C equivalent] (C++11)
与其他答案一样,C++常见问题中的以下内容是单行回答:在可能的情况下引用,需要时提供指针。
与指针相比,需要显式转换才能传递NULL。不过还是有可能的。在我测试过的编译器中,没有一个发出以下警告:
int* p() {
return 0;
}
void x(int& y) {
y = 1;
}
int main() {
x(*p());
}发布于 2011-12-20 05:21:37
实际上,大多数编译器为两个函数调用发出相同的代码,因为引用通常是使用指针实现的。
按照这个逻辑,当函数体中使用(非const)引用类型的参数时,生成的代码将静默地对参数的地址进行操作,并取消引用它。此外,当遇到对这样一个函数的调用时,编译器将生成传递参数地址的代码,而不是复制它们的值。
基本上,从实现的角度来看,引用和指针并没有很大的不同,的主要区别(也是非常重要的)是哲学上的:引用是对象本身,只是用不同的名称。
与指针相比,引用具有更多的优势(例如,它们不能是NULL,所以使用起来更安全)。因此,如果您可以使用C++,那么通过引用传递通常被认为是更优雅的,应该是首选的。但是,在C中,不存在引用传递,所以如果您想编写C代码(或者可怕的命令,用C编译器和C++编译器编译的代码,尽管这不是一个好主意),那么您必须限制自己使用指针。
发布于 2011-12-20 05:18:40
指针传递是C中传递“通过引用”的唯一方法,因此仍然可以看到它被大量使用。
空指针是表示参数未使用或无效的方便约定,因此在这种情况下使用指针。
一旦设置了引用,就不能更新它们,因此,如果需要重新分配引用,请使用指针。
在每一种情况下,如果没有很好的理由不这样做,都更喜欢引用。如果可以的话,让它成为const。
https://stackoverflow.com/questions/8571078
复制相似问题