2014-01-20 168 views
0

讓我先說。我知道標題懷疑我問了一個問題,這個問題在這裏和互聯網上多次被回答。我做了研究,但我找不到滿意的答案。重新撥打電話與撥打電話

我的問題最終歸結於此。爲什麼通過引用調用Java調用值和C++調用(何時使用指針)?

傳遞引用時需要考慮Java中的方法調用,而傳遞指針時要考慮使用C++中的方法調用。最後,在這兩種情況下,我都可以對調用者進行更改。在這兩種情況下,我都將對象的地址傳遞給函數。實際上,我正在複製,即在傳遞指針時,也通過C++中的值進行調用。

您可以簡單地通過運行下面的代碼驗證情況:

#include <iostream> 

void modify (int *i) { 
    int a = 5; 
    i = &a; 
} 

int main() { 
    int b; 
    int *i = &b; 
    std::cout << i << std::endl; 
    modify(i); 
    std::cout << i << std::endl; 
    return 0; 
} 

,它將打印相同的地址兩次。

對我來說,僅僅通過引用屬性來證明你可以用它做交換功能是不夠的。我想知道通過引用引用通過引用調用的內容。

預先感謝您。

+0

「爲什麼是Java調用按價值計算,C++調用由引用(使用指針時)?」因爲設計語言的人以這種方式指定了他們。 – twalberg

回答

1

我的問題最終歸結於此。爲什麼通過引用調用Java調用值和C++調用(何時使用指針)?

C++真的是按值調用,而不是通過引用調用。在C++中看到的by-reference行爲是您傳遞指針這一事實的副作用:指針本身是通過值複製的。你不能比較這些情況,因爲Java沒有指針。

+0

如果這是真的比互聯網上的許多來源使用無效的術語... – ben

+0

@ user2820379通過值傳遞的指針可用於修改它指向的對象(但不是指針),就像當java通過通過值引用,它可以用來修改它引用的對象(但不是引用)。 – user3125280

+0

聽起來對我來說非常直觀。我只是困惑,因爲C++通常被稱爲支持通過引用來調用。 – ben

0

您給出的示例是不恰當地使用通過引用的呼叫。在功能modify

void modify (int *i) { 
    int a = 5; 
    i = &a; 
} 

您聲明一個局部變量a這是在棧上。當它超出範圍時,它的地址是沒有意義的。因此將a的地址分配給ii指向的內容沒有影響。

那麼通過引用調用的工作是什麼,您可以修改函數中指向i的值。例如:

void modify (int *i) { 
    int a = 5; 
    *i = a; 
} 

因此在主函數中,你可以這樣調用它:

int b = 2; 
int *i = &b; 
std::cout << *i << std::endl; //This will print 2 
modify(i); 
std::cout << *i << std::endl; //This will prints 5 
+0

你是絕對正確的。我給出的例子只是強調指針是按值傳遞的目的。 – ben