确实,“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的智能指针)并且不需要直接和硬件打交道的场景下,还是尽量不要用指针比较好


------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。