2010-03-08 64 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?