通过&参考之间有什么区别?和*?

时间:2011-12-06 21:01:37

标签: c++ pointers parameter-passing

声明函数时,参数string*string&之间有什么区别?我知道string s会复制字符串s并按值传递,但似乎在许多网站上,它们都引用string* sstring& s作为参考传递。我是C ++的新手,这是我唯一无法弄清楚自己的东西。在此先感谢:)

5 个答案:

答案 0 :(得分:2)

这里的体面解释:

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

(提示:除了“它看起来不同”之外还有更多内容)

答案 1 :(得分:1)

通过指针string* s传递一个地址,因此s不是string类型,而是一个地址。如果你取消引用它,那就是使用包含*s的表达式,那么*s是字符串类型。

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

答案 2 :(得分:0)

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

除了. vs ->

之外
  • 指针是第一类对象而引用则不是。您可以获取指针的地址,但不能获取引用的地址(您将获得引用对象的地址)
  • 引用始终在其生命周期内引用同一对象。非常量指针可以改变。
  • 引用不能是“null对象”。您可以编写执行此操作的代码,但您依赖于未指定的编译器行为
  • 你可以对指针做算术

一般来说,语言规范对引用的描述很少,故意为编译器编写者提供了很多实施自由度。它们的操作很像const指针这一事实并不能保证规范。

答案 3 :(得分:0)

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

  1. 调用者必须传递一个指针,该指针很可能是自动变量的地址。这使得阅读调用代码的人明显看出传递地址的变量可能会发生变化。
  2. 指针可以具有NULL值,其作用类似于哨兵。参考不能这样做。例如,在你自己的string& amp;与字符串*相比,空字符串可能是变量的可接受值,因此无法用作标记。但是,指针参数的NULL值告诉您的函数调用者未设置字符串*参数。接收字符串&无法确定调用者是否未设置该值或是否具有默认初始化值。

答案 4 :(得分:-2)

主要区别在于如何调用函数。请考虑以下示例:

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

和参考版本:

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

因此函数调用看起来不同......

`