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)
我需要帮助来清除我的一些困惑。
foo(),是a == *ptr && a == 1吗?bar(),是b == ptr吗?bar(),是&b == &ptr吗?new int(1))ptr存储在另一个变量中。这是因为在这种情况下复制了ptr,就像在Q.1中那样,但是整数值恰好是一个内存地址?son*_*yao 12
- 当控件在里面时
foo(),是a == *ptr && a == 1吗?
是。该参数a是拷贝初始化从参数*ptr,它的价值将是相同*ptr的,即1。
- 当控件在里面时
bar(),是b == ptr吗?
是。参数b是从参数复制初始化的ptr,其值将与相同ptr。
- 当控件在里面时
bar(),是&b == &ptr吗?
否。它们是独立的对象,并且具有不同的地址。
- 如果您对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。