原始问题作者
https://stackoverflow.com/questions/114180/pointer-vs-reference
将原始变量传递给函数以使用它时,最佳实践是:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
或通过:
unsigned long x = 4;
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
有什么理由选择一个而不是另一个吗?
指针和引用在概念上是相同的,尽管它们之间存在细微差别。其中最显着的(可能也是最不重要的,尽管它更舒适、更易读)是引用不需要
->
指针访问成员所需的箭头语法(如果对象 (class
) 或记录 (struct
) 是指向) 或访问操作符*
,但使用相同的名称来访问值,以及操作符.
,将与同一对象一起使用的操作符来访问成员。事实上,引用的发明是为了避免在通过引用传递(以及通过引用返回)时必须使用指针,也就是说,当您希望在调用指向对象的函数中进行更改以影响调用函数时。
对于您真正想要获得的内容,此代码相对复杂:
虽然带有引用的版本更具可读性:
所以,对于具体的问题,我当然认为使用引用是最合适的。潜在的问题是:是否可以始终使用引用而不是指针?答案是否定的,因为引用具有其操作固有的几个限制:
不能将引用初始化为 NULL 或 nullptr。此外,它们甚至不能在没有初始化的情况下创建。并且一旦初始化,您就不能更改它们指向的对象或值。
您不能将指针算术与引用一起使用。例如,您不能通过引用遍历对象向量,因为一旦创建它就无法更改它指向的对象。
因此,不能使用引用编写以下代码:
因此,另一个答案中的“经验法则”:如果您需要指向多个对象,或者您需要指出没有指向任何对象(NULL 值),或者您需要使用指针算术,那么您可以t 使用参考。但是,当您可以使用它们时,请不要犹豫,因为它们的语法使它们更具可读性。
我希望我有所帮助。
一个重要的区别是指针可以与 NULL 进行比较,而引用则不能。
尽管这些事情总是主观的,但最被接受的样式规则之一是 Google ( https://google.github.io/styleguide/cppguide.html#Reference_Arguments ),它建议仅通过引用传递值的参数他们永远不会改变(const)。如果参数可以更改,他们建议将它们作为指针传递,以确认它们不为 NULL。更一般地说,他们说引用具有指针行为,但值语法使它们令人困惑。
原作者
我的经验法则是:
如果您想对指针进行指针运算(例如,在通过数组时增加指针的地址),或者如果您必须传递 NULL 指针,请使用指针。
以另一种方式使用引用。