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);
}
我需要帮助来解决我的一些困惑。
- 控件在
foo()
里面的时候,是a == *ptr && a == 1
吗?
- 控件在
bar()
里面的时候,是b == ptr
吗?
- 控件在
bar()
里面的时候,是&b == &ptr
吗?
- 如果您对问题 3 的回答是错误的,那么在 C++ 中甚至有任何作为引用调用的东西吗?看起来指针仍然按值传递,但我们现在将
ptr
的内容(new int(1)
的内存地址)存储在另一个变量中。这是因为在这种情况下 ptr 被复制了,就像我们在 Q.1 中遇到的情况一样,但整数值恰好是内存地址?
- When the control is inside
foo()
, is a == *ptr && a == 1
?
是的。参数 a
是参数 *ptr
的 copy-initialized,其值将与 *ptr
相同,即 1
.
- When the control is inside
bar()
, is b == ptr
?
是的。参数 b
是参数 ptr
的 copy-initialized,其值与 ptr
.
相同
- When the control is inside
bar()
, is &b == &ptr
?
没有。它们是独立的对象,具有不同的地址。
- 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
的值。
考虑以下函数定义:
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
吗? - 如果您对问题 3 的回答是错误的,那么在 C++ 中甚至有任何作为引用调用的东西吗?看起来指针仍然按值传递,但我们现在将
ptr
的内容(new int(1)
的内存地址)存储在另一个变量中。这是因为在这种情况下 ptr 被复制了,就像我们在 Q.1 中遇到的情况一样,但整数值恰好是内存地址?
- When the control is inside
foo()
, isa == *ptr && a == 1
?
是的。参数 a
是参数 *ptr
的 copy-initialized,其值将与 *ptr
相同,即 1
.
- When the control is inside
bar()
, isb == ptr
?
是的。参数 b
是参数 ptr
的 copy-initialized,其值与 ptr
.
- When the control is inside
bar()
, is&b == &ptr
?
没有。它们是独立的对象,具有不同的地址。
- 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
的值。