在C ++中按值传递指针吗?

Twa*_*kar 4 c++ pointers pass-by-value

请考虑以下函数定义:

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

int main()
{
    int *ptr = new int(1);
    foo(*ptr);
    bar(ptr);
}
Run Code Online (Sandbox Code Playgroud)

我需要帮助来清除我的一些困惑。

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

son*_*yao 12

  1. 当控件在里面时foo(),是a == *ptr && a == 1吗?

是。该参数a拷贝初始化从参数*ptr,它的价值将是相同*ptr的,即1

  1. 当控件在里面时bar(),是b == ptr吗?

是。参数b是从参数复制初始化ptr,其值将与相同ptr

  1. 当控件在里面时bar(),是&b == &ptr吗?

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

  1. 如果您对Q.3的回答是否定的,那么C ++中甚至有什么可以作为按引用调用的?

是。您可以将其更改为通过引用。

int bar(int *&b);
Run Code Online (Sandbox Code Playgroud)

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

最后,

在C ++中按值传递指针吗?

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

编辑

您能否评论class_name* &b在任何情况下是否有用?

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

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


Som*_*ude 10

除非您使用参考说明符,否则&所有内容均按值传递。

如果是bar变量ptr本身的值,则将其复制到局部参数变量中b。由于对b(like b = some_other_pointer)的更改bar仅在函数本地进行,因此变量ptr不会更改。


您可以使用指针来模拟按引用传递,这在C语言中很常用。

例如,bar如果在内部进行*b = 5;更改,则会更改的值*ptr