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

Posted

技术标签:

【中文标题】C++中的指针是按值传递的吗?【英文标题】:Are pointers passed by value in 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);

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

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

【问题讨论】:

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

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

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

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

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

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

    如果您对 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 的值。

【讨论】:

以上是关于C++中的指针是按值传递的吗?的主要内容,如果未能解决你的问题,请参考以下文章

列表是按值传递的吗?

切片是按值传递的吗?

Python 的布尔值是按值传递的吗?

我可以让 C++ 编译器决定是按值传递还是按引用传递?

java中的参数传递是按引用传递还是按值传递

按值传递时“const”不是多余的吗? [复制]