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++中的指针是按值传递的吗?的主要内容,如果未能解决你的问题,请参考以下文章