2014-09-22 62 views
2

我來自C,並且我已經瞭解到,如果我們將一個參數傳遞給一個函數,它只會使用它的值來複制它,所以如果我們改變這個變量值,那麼變量傳遞給函數的內容不會改變,因爲它們顯然是2個不同的變量,只有2個不同的地址具有相同的值。 所以在C中,如果我們想要改變傳遞給函數的參數,我們會傳遞一個帶參數地址的指針。現在通過引用和指針傳遞參數

,在C++中,我們可以做同樣的,但我們也可以這樣做:

void changeValue(int& n) 
{ 
    n = 10; 
} 

不僅如此,我們還沒有取消引用分配一個值,但是,當我們傳遞變量到函數我們按原樣傳遞它(&)運算符。 所以我不明白這裏有什麼區別? 如果我們不去引用它甚至是一個指針?另外,如果我們按照原樣傳遞它,那麼我們是如何通過引用來傳遞的呢? 有人可以幫我清理一些東西嗎?

+0

與什麼有什麼不同?函數簽名表示參數是通過引用傳遞的,所以它是。 – juanchopanza 2014-09-22 15:14:15

+1

這個線程有幫助嗎? http://stackoverflow.com/questions/410593/pass-by-reference-value-in-c – taocp 2014-09-22 15:14:44

+0

簡單的答案是'C'只有傳遞值,而C++有傳遞值和傳遞-引用。所以你應該學習後者,因爲這個概念在'C'中不存在。此外,試圖通過使用'C'作爲指導來學習C++ - 這可能適用於某些事情,但是如果這個概念根本不存在於'C'中(例如傳遞引用),那麼,就像現在的情況一樣,我會感到困惑。 – PaulMcKenzie 2014-09-22 15:26:03

回答

3

C++有指針(保持向後兼容C)和引用。正如您所提到的,使用指針,您正在處理地址,解引用操作符等。使用C++引用時,您不必擔心,因爲引用是另一個變量的別名。也就是說,對引用的任何修改都會反映在實際變量中。

引用可以由編譯器實現爲指針,但不是必需的。

當您想要重載操作符時,參考文獻真的很閃亮。例如,如果你建立一個自定義的數字類型來表示一個矩陣,你可以創建一個加法運算符,如

matrix operator + (matrix m1, matrix m2); 

但是,這會招致很多複製。您可以使用指針:

matrix operator + (matrix* m1, matrix* m2); 

但隨後調用的代碼將是非常難看:

matrix m = &m1 + &m2; 

引用允許我們寫出以避免複製的方式操作,並可以讓我們清晰地使用它在呼叫地點沒有到達運營商的地址。

所以最後:C++中的引用類似於指針,因爲它們允許您通過多個變量引用相同的值。但是,與需要使用內存地址的指針不同,引用是語法上的便利,誰的實際實現取決於編譯器。

我希望這會有所幫助。

+0

基本上函數中的變量具有與傳遞給該函數的變量相同的地址,但它不是一個指針嗎?只有2個共享相同地址的變量? @bstamour – 2014-09-22 15:32:12

+0

你可以這樣想,是的。如果你想使用指針來減輕你的理解,一個引用是一個常量指針(即不能改變指向別處的指針)。 – bstamour 2014-09-23 12:44:05