通过指针传递和通过引用
可能重复:
指针variables和引用variables在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 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
引用在语义上如下:
T& <=> *(T * const)
const T& <=> *(T const * const)
T&& <=> [no C equivalent]
(C ++ 11)
和其他答案一样,C ++ FAQ中的以下内容是单行的答案:尽可能引用,需要时指针。
指针的一个优点是你需要显式的强制转换来传递NULL。 尽pipe如此,这仍然是可能的。 在我testing过的编译器中,没有发出以下警告:
int* p() { return 0; } void x(int& y) { y = 1; } int main() { x(*p()); }
实际上,大多数编译器对于这两个函数调用都发出相同的代码,因为引用通常是使用指针来实现的。
遵循这个逻辑,当在函数体中使用(非const)引用types的参数时,生成的代码将静静地操作参数的地址,并将其解引用。 另外,当遇到这样的函数调用时,编译器将生成传递参数地址的代码,而不是复制它们的值。
基本上,引用和指针与实现的angular度并没有太大的不同,主要的(也是非常重要的)区别在于哲学: 引用是对象本身,只是名称不同而已。
与指针相比,引用有更多的优点(例如,它们不能是NULL
,所以它们更安全)。 因此,如果你可以使用C ++,那么通过引用传递通常被认为更优雅,应该是优选的。 然而,在C语言中,没有引用的路经,所以如果你想编写C代码(或者可怕的代码,可以用C和C ++编译器编译的代码,虽然这不是一个好主意),但是你必须限制自己使用指针。
传递指针是你可以在C中通过“引用”传递的唯一方式,所以你仍然可以看到它被使用了很多。
NULL指针是一个方便的约定,说一个参数是不使用或无效的,所以在这种情况下使用一个指针。
引用无法在设置后更新,因此如果您需要重新分配引用,请使用指针。
在没有好的理由的情况下,请select参考。 如果可以的话,使它成为const
。
关于这个问题, 这里有一篇很好的文章 – “尽可能使用参考文献,必要时提供指导。”
所有的时间和指针,只有当你必须引用NULL
引用无法引用时使用引用。
看到这个常见问题: http : //www.parashift.com/c++-faq-lite/references.html#faq-8.6