【问题标题】:Are pointers passed by value in C++?C++中的指针是按值传递的吗?
【发布时间】:2020-03-10 07:33:27
【问题描述】:

考虑以下函数定义:

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. 如果您对 Q.3 的回答是错误的,那么在 C++ 中是否有任何作为引用调用的东西?看起来指针仍然是按值传递的,但我们现在将 ptr 的内容(到 new int(1) 的内存地址)存储在另一个变量中。这是因为在这种情况下,ptr 被复制了,就像我们在 Q.1 中遇到的情况一样,但整数值恰好是内存地址?

【问题讨论】:

    标签: c++ pointers pass-by-value


    【解决方案1】:
    1. 当控件在foo()里面时,是a == *ptr && a == 1吗?

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

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

    是的。参数b 是来自参数ptrcopy-initialized,其值将与ptr 相同。

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

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

    1. 如果您对 Q.3 的回答是错误的,那么在 C++ 中还有什么可以作为引用调用的吗?

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

    int bar(int *&b);
    

    那么参数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
    }
    

    【讨论】:

    • &*b == &*ptr 也是如此,是传递引用的一种形式
    • 你会评论class_name* &b在任何场景中是否有用吗?
    • @TwaritWaikar 答案已修改。
    【解决方案2】:

    除非你使用引用说明符&,否则一切都是按值传递的。

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


    你可以使用指针来emulate通过引用传递,这在C语言中很常用。

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

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 2014-04-07
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多