2013-02-13 78 views
3

學習C++的基礎知識,並試圖將我的頭包裹在指針以及何時使用它們。從Javascript-Actionscript背景來看,我想不出任何類似的東西。Actionscript-Javascript中的C++指針的概念

任何人都可以提示在Javascript或ActionScript 3中的指針的任何等價物,也可以使用它們嗎?

回答

4

快速簡單的回答是,沒有什麼類似於javascript或actionscript中的指針,但我可能會爲你畫出一些細膩的明喻。

所有的語言都是通過指針實現給你的功能,但是大多數現代語言都將它們隱藏在程序員之外。 C/C++通過暴露它們並要求您使用它們,爲您提供了許多強大的功能;大多數其他語言通過隱藏它們來防止程序員傷害自己。對自己的記憶管理負責可能是危險的。此外,請記住,C和C++是比JavaScript,ActionScript甚至Java或C#更早的語言 - 指針語法對於那些「原始」時間是必需的。 (C在內存管理中非常接近彙編代碼,而C++則直接來自C)。

但是每一種編程語言都需要管理內存 - 它們必須讓你創建(新)變量,訪問這些變量,並存儲對它們的引用。功能也是如此。

看看你做的一些事情,並用指針思維來思考它們。

  • 當您將變量設置爲命名函數時,虛擬機正在內存中查找函數,並將該變量設置爲指向該內存。 (在C中,這稱爲函數指針,C++也使用它)
  • 當您設置一個變量等於一個匿名函數時,您的虛擬機會在內存中某處創建函數,將該變量設置爲指向該區域在它的記憶中,並讓你參考它。
  • 當您調用new時,您正在創建一個新的參考。虛擬機再一次在內存中創建一個點,併爲您提供一種訪問方式。
  • 當你將一個對象傳遞給一個函數時,你不會傳遞整個對象,而是傳遞一個對象的引用。 VM使用你的變量來告訴函數使用哪部分內存以及它應該如何表現。

如果您開始在C/C++中進行大量編程,您會發現在幾乎所有的事情中都使用指針(和引用,這是一個相關的概念)。一旦你習慣了它,你會發現你一直在使用類似的概念 - 你不必明確地知道你在做什麼。你會更清楚每種編程語言與它的內存有什麼關係 - 無論是隱式還是顯式。

1

中沒有類似的概念。

C++超越了C語言的指針概念。基本上C/C++指針持有具體的內存地址類型的實例,但C++增加了類類型的多態解析。

在C++中傳遞(作爲函數參數)或存儲(作爲變量,類屬性)對類型實例的引用的首選機制是(uummm)引用或值。在所有情況下,這可能都是不可能的或想要的。

C++引用(請參見&類型說明符)基本相同,但必須將初始化爲引用有效類型實例的有效內存地址。相比之下,指針還可以包含NULL值,表示沒有引用有效的類型實例。

此外,它完全不鼓勵在C++中使用原始指針類型(類似C)。標準庫爲實例引用的特定語義用例情況提供了幾個指針,如代理(智能指針類型),用於處理生命週期管理a.s.o. (回想起C++沒有內在的垃圾收集機制)。

在Google和SO上有關於此主題的更多資源。

0

考慮下面的例子:

a = {a:1, b:2}; 
b = a; 
b.a = 4; 
console.log(a.a); // outputs 4 

隨着對象的JavaScript行爲類似指針做。

1

沒有很好的1對1映射。指針隱藏在其他語言中,因爲雖然功能非常強大,但也容易導致應用程序崩潰。

通常,當您使用的對象的生命週期允許它轉義創建上下文時,您使用指針。即使這樣,最好的做法是將指針包裝在另一個對象中,並在適當的時候自動刪除指針。

如果您將一些研究放入C++參考中,並且C++將默默複製一個對象(複製構造函數等),則引用的用處將變得明顯。然後當你意識到引用有一些使用限制時,你只剩下指針。 :)

希望能讓你開始!

0

我喜歡從概念上考慮指針,就像有兩列和無限多行的巨型表。在第一列中,我們有地址的內存,並在第二,我們有存儲在該地址它可能看起來像值:

char *catString = "cat"; //C picked free space at address 3 to hold this string

Address  Value 
    0   23 
    1   'r' 
    2   12.2 
    3   'c' 
    4   'a' 
    5   't' 
    6   '/0' 
    ...  ... 

凡catString實際持有價值3,沒有「貓」 。字符串「cat」在內存中,而指針catString只知道該字符串的位置,並且指向該內存地址字符串中的第一個字母。這也是爲什麼字符串需要空插頭,注意地址6,所以當打印時,程序知道何時停止打印字符。 char *str;是更多的C風格的讀取,字符數組,這相當於C++中的string str;,它更友好!

1

通過考慮一個指針(或引用),一個值hold the address of the actual object;
在AS3到一個亞類爲「Object」的任何參考是一個指針:

var a:Point = new Point(0, 0); 
var pointer:Point; 
pointer = a; 

任何修改到對象「指示器」實際修改「a」和因此「指示器」是一個指針/引用(持有地址)爲'a',即使傳遞給函數作爲參數:參數是一個指針(通過引用而不是值傳遞)。
但是,原始類型不是'Object'的子類,而是'Point',它總是按值(複製)傳遞給新的變量或參數;原始類型包括int,uint,Boolean,Number,String。
順便說一下,C++ pointers are a special kind of 'reference' implementation.

0

這是另一個關於它的問題。

將指針想象成手中的紙條,告訴您要在廚房中的特定抽屜中查看。你可以把紙條傳給住在房子裏的任何人,如果他們按照紙條上的指示,他們都會打開同一個抽屜。

如果人A將東西放入抽屜中,然後在稍後時間將紙片給人B,則人B仍然可以找到人A放置在那裏的任何東西。

依此類推。