“指針”是成熟的編程語言必須具有的概念嗎?
https://segmentfault.com/q/1010000003797714
我在看一個日本人寫的書《征服 C 指針》,書上的引言提到這麽一句話
確實,“C指針”有著底層而邪惡的一面,但是,它又是構造鏈表和樹等“數據結構”不可缺少的概念。如果沒有指針,我們是 做不出像樣的應用程序的。所以,凡是真正成熟的開發語言,必定會存在指針,如Pascal、Delphi、Lisp 和Smalltalk 等,就連Visual Basic 也存在指針。 早期的Perl 因為沒有指針而飽受批評,從版本5 開始也引入了指針的概念。 當然,Java 也是有指針的。很遺憾,世上好像對此還存有根深蒂固的誤解。
在本書中,我們將體驗如何將指針真正地用於構造數據結構。
“指針”是成熟的編程語言必須具有的概念。
它上面提到的這些語言我都沒有學過,但是根據我學過的 JavaScript,Python 和 Ruby,它們都是沒有指針的啊,這是怎麽回事呢?難道是作者錯了,還是我理解有問題呢?
指針
的本意是:在一個變量中保存另一個變量的地址,以提供將“地址”變量化的能力。如果沒有指針,將無法用一個變量引用另一個變量(只能把變量的值拷貝一份賦給另一個變量)。
C語言
中提供了完善的指針操作,包括為指針賦值、內存分配(malloc
)、取變量地址、讓指針可以參與運算等,這使得C
程序員能夠任意操作可用內存。
Java
(Javascript
)中也有指針,只不過與C
相比,Java
new
創建的對象引用或其他引用變量的值。不過Java
一般不說指針,而是用引用
(reference
)來稱呼指向對象的指針,不過,Java
中仍然可以找到一些指針存在的影子,例如,當一個對象為null
時調用方法會導致null pointer
異常,即所謂的空指針錯誤
,可見Java
內部使用的確實是指針。
很多基本的數據結構,例如鏈表、樹、圖等,都必須用指針來保存前驅或後繼節點的地址,否則這些數據結構無法實現。
如果一個語言不提供指針,雖然在理論上它也具備完整的計算能力,但很多在其他語言中非常簡單的問題都將變得極其復雜(本來想舉個例子的,但一時想不起了,不過這個結論肯定是正確的)。
所以這個作者說的是對的,只是你需要理解指針的本質,不要錯誤地認為只有像C語言那樣的指針才叫指針
,真正的指針的概念請看我開頭的那句。
沒看過那個作者的書 但java裏面叫引用 和指針還是有區別的 並不能直接操縱內存
個人理解指針的存在是為了獲得運行時的效率和底層訪問的能力 然而對於一個成熟的編程語言 這兩個在現在看來並不是必須的特性 而開發效率 解決特定問題的能力等也是重要的考量
首先,c語言的指針和其他語言的指針有本質區別。c語言的指針是可以任意賦值,任意解引用的指針,其他語言是閹割過的,很難自由使用
其次,c語言的指針用於操作底層,實際上它是一門介於高級和匯編之間的語言才有的特征。個人認為,c++的指針完全是為了兼容c才做出的保留,在c++11的編程規範中已不提倡使用。
你肯定沒搞過單片機,在單片機上我恨不得用匯編……(特別是在邏輯不復雜的情況下)
C的指針是對“底層可操作性”的一種妥協,至於其他童鞋說的 ‘將“地址”變量化的能力’ 那個就不是C中狹義的“指針”了,畢竟引用是不能隨便在內存地址空間上瞎JB移動了(對於單片機這樣和硬件打交道比較多的平臺,這是好事,但是如果專註於較高層次的邏輯的話,這是壞事,因為你的註意力經常要被野指針、內存泄漏等等坑爹的事情給吸引過去)
所以,在擁有合適工具(比如Java的引用+GC,C++11的智能指針)並且不需要直接和硬件打交道的場景下,還是盡量不要用指針比較好
“指針”是成熟的編程語言必須具有的概念嗎?