2013-07-07 42 views
0

不管在指針引用提供了方便的,如解引用的無針和規則特定使用每個的,Go和C++中指針和引用之間的邏輯差異?

是有提供兩個語言構造作爲指針和引用的任何邏輯的原因或者是它只是一個語法糖?

(我猜的最終落腳點實現,作爲與言下之意指針做/檢查由語言的引用定義的規則,編譯器將使用相同的步驟進行的引用。)

注:問題是不是規則的語言在參考定義,如「引用不允許在C分配NULL ++但指針」等

+0

在C++中,引用是對象的別名。它遠遠超出語法糖:它始終指向同一個對象,並且不支持指針算術。 – juanchopanza

+0

這聽起來像一個有趣的問題,但我無法弄清楚你在問什麼。 Go和C++如何發揮作用?你在尋找什麼確切的「差異」?你能否澄清這個問題? –

+0

@Kerrek Go和C++已經包含了使問題具體化的問題,因此允許提供具體的答案。此外,兩種語言對refs和pointers都有相同的語義。 – nish1013

回答

3

你問兩個問題,如果我理解正確

  1. 是什麼指針和引用
  2. 之間的差異爲什麼支持兩種數據類型

這裏所說:

  1. 的指針指的位置在內存中數據類型所在。指針的大小是固定的,給定底層硬件,通常是4或8個字節 - 完全不管它實際指向什麼。此外,可以使用無效值將指針傳遞給函數 - foo(reintepret_cast<int *>(0xDEADBEEF));。 相比之下,引用可確保底層數據有效 - 因爲引用是對象本身的別名,並且不能從此移動(假定引用的對象仍在範圍內 - 每條註釋編輯爲 )。
  2. 還有支持這兩種類型的原因。第一個原因是確保傳遞給函數的數據是有效的 - 不浪費測試指針有效性的週期(不是NULL)。第二個原因是可以肯定的是,不僅數據指向有效的位置,它還指向有效的數據對象。但主要原因是參考使我們能夠享受調用函數的好處,而不需要按值傳遞參數,但仍保證參數指向有效值。
+0

@levngli。非常有建設性的答案,非常感謝。作爲這個答案的一部分,你能否把'別名'概念作爲回答,使這個答案更有價值。 – nish1013

+0

當然,別名的含義是引用指的是確切的對象。換句話說,如果在'bar' - 'rZog'和'foo'中有'int foo'這樣的對象和一個帶有'bar(int&rZog)'簽名的函數,並且你調用了'bar(foo)''是相同的。分支之處在於''rZog'的變化在離開'bar'後會在'foo'中有效。應該將'bar'實現爲void bar(int&rZog){rZog * = 2;}';一旦被調用,'foo'本身將被乘以2.「 – levengli

+1

」相比之下,引用確保底層數據有效「不正確。如果你有一個超出範圍的變量的引用,它就不再有效。如果您通過該參考,它仍然無效。 – newacct

0

你應該問Bjarne Stroustrup爲什麼C++有引用。在其他地方,他提供了第7.7節「參考」,「C++編程語言」第四版中的基本原理。 The Design and Evolution of C++ 86。

+0

你能否在這裏提供一個總結? – nish1013