如果没有指针,就无法构造正统的数据结构, 因此,比较成熟的、正统的编程语言,必定会存在指针3

3以前, FORTRAN 、 COBOL 和BASIC 中 都没有指针,但是在 fortran90、Visual Basic 等升级版中,正式引入 了指针功能。

咦?我怎么听说Java 就没有指针呢……

我可以负责任地告诉你,这是个谣言。

第4 章的补充内容中也曾经提到,Java 只能通过指针来操作数组和对 象,因此,Java 比C 更离不开指针。

在早期的Java 白皮书中,就有“Java 中没有指针”这样的说法4。Java 中被称为“引用”的概念,在C 和Pascal 的程序员看来,怎么看都相当于 指针。我认为在“Java 中没有指针”这个观点的背后,弥漫着下面这样“狡 猾的”市场营销的气味,
4请参照http://java.sun. com/docs/overviews/ java/java-overview-1. html。

因为对于C 语言,大家都认为“指针比较难”,如果强调“没 有指针”,编程新手也许更容易接受。

但是Java 的引用又和C 的指针有着很大的不同。Java 没有指针运算, 因此不存在指针运算和数组之间的那种微妙关系,此外你也不能取得指向 变量的指针。如果你认为这些差别能成为“Java 中没有指针”的理由,那 么Pascal 是不是也没有指针呢?

除Java 之外,Lisp、Smalltalk 和Perl(Ver.5 以后)中相当于指针的对 象也被称为“引用”,但是也有人会使用“指针”这样的叫法。也就是说, 这些语言并没有严格地将“引用”和“指针”分开。因为它们的本质相同, 所以Java 故意强调“没有指针”,反而让人觉得奇怪5

5诞生在日本的面向对 象的脚本语言Ruby, 作者在自己的著作中 就断言“Ruby 中没有 指针这样的概念”,其 实Ruby 中也有叫做 “引用”的指针。

Ruby 中连字符串这样的基本类型也不是不可变的,像这样的语言“没 有指针”,是不是很危险?

Pascal、Modula2/3 和C 一样,都称之为指针。

Ada 中的名称为“Access 类型”。这种叫法有点人让人摸不着头脑。

悲哀的是,C++在语法上将“指针”和“引用”区别成两个不同的概念。

C++的“指针”和C、Pascal 的“指针”,以及Java 的“引用”同义。 其次,C++中的“引用”是指本来应该被称为“别名”(alias)的对象,正因为是别名,所以一旦确定“别名是什么”,就再也不能修改了。

实际上,C++的术语“引用”也是通过指针实现的,所以它其实是一个 重复的功能。很多熟练的C++程序员往往不使用“引用”,而总是使用指针。 但是,在某些运算符重载,以及复制构造函数的场景下,可能会不得不使 用“引用”。对于C++,有人说它太深奥,有人说使用它开发项目成本太高, 甚至有人质疑“是否存在理解C++全貌的人”……总之,C++也是一门让人 纠结的开发语言。