初学者参考类型参数混淆

时间:2011-10-06 17:05:16

标签: c++

foo(int &bar)
{
    bar = 5;
}

对此功能的调用将是

int foobar = 2;

foo(foobar);

我是否正确地认为函数参数基本上“获取”变量的内存地址,但是然后不必在foo中取消引用,并且我将改变foobar的原始值?在此之前,我在印象中,你必须传递这样的记忆地址:

foo(&foobar);

然后在foo中使用变量,如下所示:

*bar = 5;

我认为这是错的吗?我认为,就像许多初学者一样,混淆来自于认为引用就像一个指针,因为它拥有一个内存地址,但它从来就不是真正的类型吗?只是一个操作员。

2 个答案:

答案 0 :(得分:1)

引用通常用底层指针实现(尽管标准没有强制要求),但它们与指针完全不同。引用只是现有变量的新名称或别名。当你这样做

void foo(int& bar)
{
    bar = 5;
}

int foobar = 2;
foo(foobar);

您要调用foo以使用变量foobar进行评估,因此bar foofoobar成为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:)