1. 程式人生 > >“指針”是成熟的編程語言必須具有的概念嗎?

“指針”是成熟的編程語言必須具有的概念嗎?

enc 移動 get visual 賦值 code 量化 解引用 很難

https://segmentfault.com/q/1010000003797714

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

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

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

“指針”是成熟的編程語言必須具有的概念。

它上面提到的這些語言我都沒有學過,但是根據我學過的 JavaScript,Python 和 Ruby,它們都是沒有指針的啊,這是怎麽回事呢?難道是作者錯了,還是我理解有問題呢?

指針的本意是:在一個變量中保存另一個變量的地址,以提供將“地址”變量化的能力。如果沒有指針,將無法用一個變量引用另一個變量(只能把變量的值拷貝一份賦給另一個變量)。

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

JavaJavascript)中也有指針,只不過與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的智能指針)並且不需要直接和硬件打交道的場景下,還是盡量不要用指針比較好

“指針”是成熟的編程語言必須具有的概念嗎?