C++中指针是按值传递的吗?

Are pointers passed by value in C++?

考虑以下函数定义:

int foo(int a);
int bar(int *b);

int main()
{
    int *ptr = new int(1);
    foo(*ptr);
    bar(ptr);
}

我需要帮助来解决我的一些困惑。

  1. 控件在foo()里面的时候,是a == *ptr && a == 1吗?
  2. 控件在bar()里面的时候,是b == ptr吗?
  3. 控件在bar()里面的时候,是&b == &ptr吗?
  4. 如果您对问题 3 的回答是错误的,那么在 C++ 中甚至有任何作为引用调用的东西吗?看起来指针仍然按值传递,但我们现在将 ptr 的内容(new int(1) 的内存地址)存储在另一个变量中。这是因为在这种情况下 ptr 被复制了,就像我们在 Q.1 中遇到的情况一样,但整数值恰好是内存地址?
  1. When the control is inside foo(), is a == *ptr && a == 1?

是的。参数 a 是参数 *ptrcopy-initialized,其值将与 *ptr 相同,即 1.

  1. When the control is inside bar(), is b == ptr?

是的。参数 b 是参数 ptrcopy-initialized,其值与 ptr.

相同
  1. When the control is inside bar(), is &b == &ptr?

没有。它们是独立的对象,具有不同的地址。

  1. If your answer to Q.3 was false then is there even anything as a call-by-reference in C++?

是的。您可以将其更改为按引用传递。

int bar(int *&b);

然后参数b将绑定到参数ptr,它是ptr的别名;那么 &b == &ptr 为真。

最后,

Are pointers passed by value in C++?

是的,它们本身是按值传递的。逻辑与您注意到的 foo 相同。

编辑

Would you comment on whether class_name* &b is useful in any scenario?

正如其他非指针类型通过引用传递一样,如果您想在函数中修改指针本身(而不是指针对象),它会很有用。例如

int bar(int *&b) {
    b = ...;  // make b pointing to anything else
              // the orginal pointer argument being passed gets changed too
}

除非您使用引用说明符 & 一切都按值传递。

bar 的情况下,变量 ptr 本身的值被复制到局部参数变量 b 中。由于对 b 的此类更改(如 b = some_other_pointer)仅限于 bar 函数,因此变量 ptr 不会更改。


您可以使用指向 emulate 的指针按引用传递,这在 C 中很常用。

例如在 bar 中,如果我们执行 *b = 5; 将更改 *ptr 的值。