回答
实际传递给函数的是参考。命名参数b
成为变元对象q
的同义词。
编译器如何实现这个功能,调用者在调用之前将q
的地址放在堆栈或寄存器中,并且被调用者使用该值影响所有对b
的访问。但将它描述为“实际传递”一个指针可能会引起误解,因为参数传递是C++语言级别的一个概念,并且在该级别上,它与传递指针不同。例如,当你传递一个指针时,你可以传递一个空指针,但是当你传递一个引用时,你不能(有效地)。所以说他们是同一件事是错误的。
也就是说,实现编译器的人可能会将其描述为“实际传递指针”,并且您知道它们的含义。为了便于比较,如果char
变量在调用约定中占用4字节的堆栈槽,他们可能会说编译器“实际上传递了一个int”。所以这取决于“实际”应该是什么意思。
*“这取决于什么”实际上“应该表示”*政治家? – Seth 2010-03-08 19:23:16
更像书呆子。 – 2010-03-08 22:28:34
它确实通过了一个引用类型 - 它有点像地址,但不完全。实际地址将是一个指针。引用不如指针强大,但可以说是更安全。 Wikipedia对指针和引用之间的区别有很好的描述。
通过引用工作的方式是由您的编译器定义的。无论如何,它们都以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大会为byRef
和byPtr
呼叫产生是完全一样的是:
lea eax, [x]
push eax
call byRef ;or byPtr
add esp, 4
你传递一个参考,这是不一个指针,而不是一个地址 - 但它是相似的。
什么“确切”的参考是,并不是一成不变的。该标准并没有规定处理参考的机制 - 仅仅是使用它们的后果。 通常,它们将作为指针来实现。
例子:
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.
其他答案提到了引用和指针之间的语义差异。
实际上,我曾经使用过的每一个编译器都以相同的方式实现它们 - 传递引用实际上是在汇编级传递一个指针。这在任何标准中都没有规定,实际情况就是这样。
问题的上来就SO前:What's the low-level difference between a pointer an a reference?
- 1. C中的引用请参考C
- 2. IS参考参考在C++?
- 3. 参考用C
- 4. 参考在C++
- 5. 参考引用其他的参考和指针引用
- 6. 在C++中传递参考
- 7. C++参考shared_ptr vs参考
- 8. 解引用的参考
- 9. 参考/解引用标识
- 10. 引用网站参考
- 11. LaTeX:引用,但不参考
- 12. C++参考和参考参数
- 13. Perl中的未引用参考
- 14. 参考var c#
- 15. 参考C#
- 16. C++参考
- 17. C++的参考
- 18. C#Windows.Security.Cryptography.Core参考
- 19. 参考C++ dll
- 20. c + +参考
- 21. 传递基准数据类型在目标C参考引用
- 22. 我可以参考Visual Studio 2010中引用的库吗(C#)
- 23. C++参考本地变量与参考
- 24. C++转发参考和右值参考
- 25. OBJ参考在C#和VB
- 26. 在线C参考手册
- 27. C++中的参考函数
- 28. Pandoc引用没有追加参考文献参考书目
- 29. C#数组参数参考
- 30. 在C++中复制数组 - 参考
我假设你知道一个参考和指针之间的区别programtic,对不对?你问是否真的被编译到? – 2010-03-08 19:10:24
@Teller - 确切地说 – Bruce 2010-03-08 19:12:39
@Peter在这种情况下,为什么不简单看一下发出的代码呢? – 2010-03-08 19:17:25