2011-10-06 66 views
1
foo(int &bar) 
{ 
    bar = 5; 
} 

这个函数的调用将初学者参考类型参数混乱

int foobar = 2; 

foo(foobar); 

我是正确的思想,函数参数本质上是“得”变量的内存地址,但不会再有将在foo中被解除引用,并且我会改变foobar的原始值?在此之前我的印象是,你将不得不在内存地址这样的经过:

foo(&foobar); 

,然后使用变量中富这样的:

*bar = 5; 

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

+0

'foo(&bar){}'不是一个合适的C++函数定义。 –

+0

http://stackoverflow.com/questions/620604/difference-between-a-pointer-and-reference-parameter的精确重复? – mydogisbox

+0

不完全是这样,我对于传递指针和传递作为参考之间的区别并不感到困惑,而是你如何使用“引用变量”这么说。 – SirYakalot

回答

1

引用通常通过底层指针来实现(尽管这不是标准要求的),但它们是与指针完全不同的野兽。引用仅仅是一个现有变量的新名称或别名。当你做

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

int foobar = 2; 
foo(foobar); 

要调用foo与变foobar进行评估,所以内foo基本bar becames foobar。这通常编译器impementation是实际执行这段代码是这样的:

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

int foobar = 2; 
foo(&foobar); 
+0

那么,只需坚持指针参数,它是更可接受的编码习惯吗? – SirYakalot

+0

@SirYakalot:不,如果有的话,则相反。语言中有两个地方。 –

0

如果你这样做:

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

int main() { 
    int x = 3; 
    foo(x); 
} 

X在主就等于6,这是因为一个参考/别名(一相同变量的不同名称)传递给foo。因此,函数foo中的bar与main中的x,相同的内存位置以及所有内容相同。

这是正常的传球像这样不同:

void foo(int bar) { bar = 6; } 

int main() { 
    int x = 3; 
    foo(x); 
} 

哪里酒吧是从X在main(注复制一个新的副本构造值拷贝构造函数能更好地适用于非标量型,但这个想法是一样的)。

最后,如果你这样做:

void foo(int* bar) { *bar = 6; } 

int main() { 
    int x = 3; 
    foo(&x); 
} 

它会说:“我想一个指向整数”为Foo的参数。主要的是,我们将“栈变量x的地址”与x的指针本质上是同一个东西,然后我们将它传递给bar。然后,取消引用栏并将其分配给6会使主元素中的x等于6 :)