2010-03-08 91 views
3

通过引用函数实际传入的内容是什么?在C++中引用参考

void foo(int &a,int &b) 

当我写

foo(p,q) 

什么是实际传递给函数。它是p和q的地址吗?

+0

我假设你知道一个参考和指针之间的区别programtic,对不对?你问是否真的被编译到? – 2010-03-08 19:10:24

+1

@Teller - 确切地说 – Bruce 2010-03-08 19:12:39

+0

@Peter在这种情况下,为什么不简单看一下发出的代码呢? – 2010-03-08 19:17:25

回答

6

实际传递给函数的是参考。命名参数b成为变元对象q的同义词。

编译器如何实现这个功能,调用者在调用之前将q的地址放在堆栈或寄存器中,并且被调用者使用该值影响所有对b的访问。但将它描述为“实际传递”一个指针可能会引起误解,因为参数传递是C++语言级别的一个概念,并且在该级别上,它与传递指针不同。例如,当你传递一个指针时,你可以传递一个空指针,但是当你传递一个引用时,你不能(有效地)。所以说他们是同一件事是错误的。

也就是说,实现编译器的人可能会将其描述为“实际传递指针”,并且您知道它们的含义。为了便于比较,如果char变量在调用约定中占用4字节的堆栈槽,他们可能会说编译器“实际上传递了一个int”。所以这取决于“实际”应该是什么意思。

+1

*“这取决于什么”实际上“应该表示”*政治家? – Seth 2010-03-08 19:23:16

+0

更像书呆子。 – 2010-03-08 22:28:34

2

它确实通过了一个引用类型 - 它有点像地址,但不完全。实际地址将是一个指针。引用不如指针强大,但可以说是更安全。 Wikipedia对指针和引用之间的区别有很好的描述。

0

通过引用工作的方式是由您的编译器定义的。无论如何,它们都以C++中的实际类型int&传递。试试这个:

int x = 10; 
int& y = x; 
x = 100; 

你认为什么是y的值?引用不是指针,而是变量的别名。编译器应用于int&的机制用于传递参考参数。

考虑下面的程序:

void byRef(int& x) 
{ 
    return; 
} 

void byVal(int x) 
{ 
    return; 
} 

void byPtr(int * x) 
{ 
    return; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    int x = 0; 
    byRef(x); 
    byVal(x); 
    byPtr(&x); 

    return 0; 
} 

的MSVC90大会为byRefbyPtr呼叫产生是完全一样的是:

lea eax, [x] 
push eax 
call byRef ;or byPtr 
add esp, 4 
1

你传递一个参考,这是不一个指针,而不是一个地址 - 但它是相似的。

什么“确切”的参考是,并不是一成不变的。该标准并没有规定处理参考的机制 - 仅仅是使用它们的后果。 通常,它们将作为指针来实现。

例子:

int foo(int& a, int& b) { a = b; } 

// Usage 
int x, y; 
foo(x, y); 

这可能会产生相同的机器码为:

int foo(int* a, int* b) { *a = *b; } 

// Usage 
int x, y; 
foo(&x, &y); 

但有没有这样的保证,两者是不等价的(虽然他们提供类似的功能)。

当您获取引用的地址时,您将获得与它所引用的对象相同的地址。例如:

void foo(int& x) { std::cout << &x << std::endl; } 

int y; 
std::cout << &y << std::endl; 
foo(); // This will print the same as above. 
3

其他答案提到了引用和指针之间的语义差异。

实际上,我曾经使用过的每一个编译器都以相同的方式实现它们 - 传递引用实际上是在汇编级传递一个指针。这在任何标准中都没有规定,实际情况就是这样。

问题的上来就SO前:What's the low-level difference between a pointer an a reference?