在 & 和 * 之间通过引用传递时有什么区别?

What is the difference when passing by reference between & and *?

本文关键字:什么 区别 引用 之间      更新时间:2023-10-16

在声明函数时,参数string*string&的区别是什么?我知道string s会复制字符串s并按值传递它,但似乎在许多网站上,他们将string* sstring& s称为引用传递。我是c++的新手,这是唯一一件我自己没能弄清楚的事情。提前感谢:)

这里有一个很好的解释:

http://www.cprogramming.com/tutorial/references.html

(提示:不只是"看起来不一样")

通过指针string* s传递一个地址,因此s不是string类型,它是一个地址。如果对它解引用,即使用包括*s在内的某些表达式,则*s为字符串类型。

通过引用string& s传递时,s是字符串类型,因此不需要解引用。

很多几乎正确的答案。许多是适合特定实现的,但依赖于编译器部分未指定的行为。

除了. vs ->:

  • 指针是第一类对象,而引用不是。你可以获取指针的地址,但不能获取引用的地址(你将获得被引用对象的地址)
  • 引用在其生命周期内总是引用同一个对象。非const指针可以改变。
  • 引用不能指向"空对象"。你可以编写这样的代码,但你依赖于未指定的编译器行为
  • 你可以在指针上做算术操作

一般来说,语言规范很少提到引用,故意给编译器作者很大的实现空间。它们的操作方式很像const指针,这一事实并没有得到规范的保证。

我发现指针参数在两个方面非常有用:

    调用者必须传递一个指针,该指针很可能是自动变量的地址。这使得读取调用代码的人很明显,传递地址的变量可能会改变。
  1. 指针可以有一个NULL值,它就像一个哨兵。引用不能做到这一点。例如,在你自己的字符串&与string *相比,空字符串可能是变量的可接受值,因此作为哨兵是无用的。但是,指针形参的NULL值告诉函数调用者没有设置字符串*参数。接收字符串&无法确定调用方是否未设置该值,还是满足于默认初始值。

主要区别在于如何调用函数。考虑这些例子:

void f(string *s)
{}
int main() {
   string s;
   f(&s);
}

和参考版本:

void f(string &s) { }
int main() {
   string s;
   f(s);
}

所以函数调用看起来不同…

"