回答
實際傳遞給函數的是參考。命名參數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. C++參考和解引用
- 3. IS參考參考在C++?
- 4. 參考用C
- 5. 參考在C++
- 6. 在C++中引用參考的用途是什麼?
- 7. 函數在RcppArmadillo中引用參考
- 8. 參考引用其他的參考和指針引用
- 9. 在C++中傳遞參考
- 10. C++參考shared_ptr vs參考
- 11. 參考使用C#
- 12. 規則在C++中使用參考
- 13. 解引用的參考
- 14. 參考/解引用標識
- 15. 引用網站參考
- 16. LaTeX:引用,但不參考
- 17. C++參考和參考參數
- 18. 在Java中模擬通過參考引用數組引用(即引用引用)
- 19. c + +參考
- 20. 參考C++ dll
- 21. C++參考
- 22. 參考C#
- 23. C#Windows.Security.Cryptography.Core參考
- 24. VoIP C++參考
- 25. 參考var c#
- 26. C++參考
- 27. 參考頁C++
- 28. C++的參考
- 29. Perl中的未引用參考
- 30. 我可以參考Visual Studio 2010中引用的庫嗎(C#)
我假設你知道一個參考和指針之間的區別programtic,對不對?你問是否真的被編譯到? – 2010-03-08 19:10:24
@Teller - 確切地說 – Bruce 2010-03-08 19:12:39
@Peter在這種情況下,爲什麼不簡單看一下發出的代碼呢? – 2010-03-08 19:17:25