foo(int &bar)
{
bar = 5;
}
对此功能的调用将是
int foobar = 2;
foo(foobar);
我是否正确地认为函数参数基本上“获取”变量的内存地址,但是然后不必在foo中取消引用,并且我将改变foobar的原始值?在此之前,我在印象中,你必须传递这样的记忆地址:
foo(&foobar);
然后在foo中使用变量,如下所示:
*bar = 5;
我认为这是错的吗?我认为,就像许多初学者一样,混淆来自于认为引用就像一个指针,因为它拥有一个内存地址,但它从来就不是真正的类型吗?只是一个操作员。
答案 0 :(得分:1)
引用通常用底层指针实现(尽管标准没有强制要求),但它们与指针完全不同。引用只是现有变量的新名称或别名。当你这样做
void foo(int& bar)
{
bar = 5;
}
int foobar = 2;
foo(foobar);
您要调用foo
以使用变量foobar
进行评估,因此bar
foo
内foobar
成为void foo(int* bar)
{
*bar = 5;
}
int foobar = 2;
foo(&foobar);
。通常的编译器实现是实际实现这样的代码:
{{1}}
答案 1 :(得分:0)
如果你这样做了:
void foo(int& bar) { bar = 6; }
int main() {
int x = 3;
foo(x);
}
main中的x将等于6.这是因为引用/别名(同一变量的不同名称)被传递到foo。因此,函数foo中的bar与主,相同内存位置和所有内容中的x相同。
这与正常传递不同:
void foo(int bar) { bar = 6; }
int main() {
int x = 3;
foo(x);
}
其中bar是从main中的x复制的新副本构造值(请注意,复制构造函数最好应用于非标量类型,但想法是相同的。)
最后,如果你这样做了:
void foo(int* bar) { *bar = 6; }
int main() {
int x = 3;
foo(&x);
}
对于foo的参数,它会说“我想要一个指向整数的指针”。在main中,我们采用“堆栈变量x的地址”,它实际上与指向x的指针相同,我们将其传递给bar。然后取消引用bar并为其分配6将使main中的x也等于6:)