「指針」是成熟的編程語言必須具備的概念嗎?

https://segmentfault.com/q/1010000003797714java

我在看一個日本人寫的書《征服 C 指針》,書上的引言提到這麼一句話c++

確實,「C指針」有着底層而邪惡的一面,可是,它又是構造鏈表和樹等「數據結構」不可缺乏的概念。若是沒有指針,咱們是 作不出像樣的應用程序的。因此,凡是真正成熟的開發語言,一定會存在指針,如Pascal、Delphi、Lisp 和Smalltalk 等,就連Visual Basic 也存在指針。 早期的Perl 由於沒有指針而飽受批評,從版本5 開始也引入了指針的概念。 固然,Java 也是有指針的。很遺憾,世上好像對此還存有根深蒂固的誤解。程序員

在本書中,咱們將體驗如何將指針真正地用於構造數據結構。編程

「指針」是成熟的編程語言必須具備的概念。segmentfault

它上面提到的這些語言我都沒有學過,可是根據我學過的 JavaScript,Python 和 Ruby,它們都是沒有指針的啊,這是怎麼回事呢?難道是做者錯了,仍是我理解有問題呢?數據結構

 

指針的本意是:在一個變量中保存另外一個變量的地址,以提供將「地址」變量化的能力。若是沒有指針,將沒法用一個變量引用另外一個變量(只能把變量的值拷貝一份賦給另外一個變量)。編程語言

C語言中提供了完善的指針操做,包括爲指針賦值、內存分配(malloc)、取變量地址、讓指針能夠參與運算等,這使得C程序員可以任意操做可用內存。工具

JavaJavascript)中也有指針,只不過與C相比,Java對程序員使用指針有着嚴格的限制,僅容許賦值操做,並且不是任意值,只能是經過new建立的對象引用或其餘引用變量的值。不過Java通常不說指針,而是用引用reference)來稱呼指向對象的指針,不過,Java中仍然能夠找到一些指針存在的影子,例如,當一個對象爲null時調用方法會致使null pointer異常,即所謂的空指針錯誤,可見Java內部使用的確實是指針。spa

不少基本的數據結構,例如鏈表、樹、圖等,都必須用指針來保存前驅或後繼節點的地址,不然這些數據結構沒法實現。指針

若是一個語言不提供指針,雖然在理論上它也具有完整的計算能力,但不少在其餘語言中很是簡單的問題都將變得極其複雜(原本想舉個例子的,但一時想不起了,不過這個結論確定是正確的)。

因此這個做者說的是對的,只是你須要理解指針的本質,不要錯誤地認爲只有像C語言那樣的指針才叫指針,真正的指針的概念請看我開頭的那句。

 

沒看過那個做者的書 但java裏面叫引用 和指針仍是有區別的 並不能直接操縱內存
我的理解指針的存在是爲了得到運行時的效率和底層訪問的能力 然而對於一個成熟的編程語言 這兩個在如今看來並非必須的特性 而開發效率 解決特定問題的能力等也是重要的考量

 

首先,c語言的指針和其餘語言的指針有本質區別。c語言的指針是能夠任意賦值,任意解引用的指針,其餘語言是閹割過的,很難自由使用

其次,c語言的指針用於操做底層,實際上它是一門介於高級和彙編之間的語言纔有的特徵。我的認爲,c++的指針徹底是爲了兼容c才作出的保留,在c++11的編程規範中已不提倡使用。

 

你確定沒搞過單片機,在單片機上我巴不得用匯編……(特別是在邏輯不復雜的狀況下)
C的指針是對「底層可操做性」的一種妥協,至於其餘童鞋說的 ‘將「地址」變量化的能力’ 那個就不是C中狹義的「指針」了,畢竟引用是不能隨便在內存地址空間上瞎JB移動了(對於單片機這樣和硬件打交道比較多的平臺,這是好事,可是若是專一於較高層次的邏輯的話,這是壞事,由於你的注意力常常要被野指針、內存泄漏等等坑爹的事情給吸引過去)因此,在擁有合適工具(好比Java的引用+GC,C++11的智能指針)而且不須要直接和硬件打交道的場景下,仍是儘可能不要用指針比較好

相關文章
相關標籤/搜索