指针之美
看到CSDN 网站论坛上有一个专题《指针的危害》,许多人提出了不同的看法,我基本上都不赞同,所以忍不住要提出我的看法。
说指针是天使者只说了指针的高效率;说指针是魔鬼者则认为指针容易致命的错误,应当尽量少用或用引用来代替云云。
大家的目光只是侷限在单个变量组成的教科书的例题上。现在我给大家提出一个现实的问题:
每个人的信息可以看作单个的结构变量,尽管每个人是独立的,但是他们是有某些联系的。你当然不会一个一个地处理单个的变量,那样太费事了。你会想到把这些变量放到一个数组里,然后循环。
但是人的关系并非单纯的线性关系。不仅中国人有家族观念,连西方人也有。中国的家谱最完善的恐怕就是孔圣人家了吧。如果让你编一个家谱程序,能添加、删除、尤其是插入和遍历,你会把老孔家的人名放到数组里吗?如果放到数组里,程序将复杂得无法想象。但是如果你有了指针,并用它把人名按家谱的对应结构形成一棵倒挂的树,当然是让孔老夫子在树根的位置,那就使得问题简单到了可以实现的程度。
这是为什么呢?因为你在编程之前要做一个需求分析的模型。你先前那个线性数组模型跟家谱不对应,因此你在编程(设计)时就不得不做无尽的转换;而我们树形的模型与家谱是有良好对应的,这样就能模拟真实世界去处理。这个道理就叫做庖丁解牛、顺理成章。切记,自然的就是正确的,人定胜天是骗人,人只能顺天。
即使现实世界的数据结构真是线性的,放到数组里有时也不合适。如果你的数组元素已经是有序的,而且数据经常发生插入和删除,那么你的数组就会经常发生大量数据的前移或后退,而链表就不会的。
指针之美几乎是说不尽的,就鄙人这点学识要说的还刚开头,也许我以后还要说,但不一定专门说。
其实一门计算机语言,并非一定要有指针,这要看这门语言是侧重于什么用途。如FORTRAN语言没有指针,但它是做科学计算用的。JAVA语言没有指针,那是因为它生下来就是为了网络编程,而网络编程是用不到指针的。所以说,不能单纯地用指针来衡量一种计算机语言的优劣,但毫无疑问,有指针的计算机语言的适用范围更大。
有人说用C++的引用代替指针。这要分场合,函数传参使用引用确实很好,尤其是对初学者。但是你用引用去构造一个树形结构的模型出来我看看。
正是因为有了指针,人们构造了各种数据结构的模型及其相应的美妙的算法,才形成了非常有用的数据结构这门学科。你可以根据提供的算法,稍加改造,用到你的程序里去。更有甚者,现在C++提供了STL标准模板库,你可以当作黑箱使用而不必知道内里的算法实现。
指针对初学者是魔鬼这句话未免言重了,我觉得它不应该那么难,我很想以后在这方面帮助需要帮助的人。
我叫陈树振,是一个老头,64岁,上世纪90年代天津保税区电力公司用的“用电业务系统”就是我编的。
我是6月9日才正式进入CSDN的。进入的原因是为了我写的书的出版。出版社觉得我写的不错,但认为我没有名气,每到快出版的时候就反悔,其中北京希望电子出版社合同公章都盖了,还反悔了呢。有编辑给我出主意,让我在CSDN上弄点人气,所以陈老汉就登台亮相了,这是我的第一篇博文,希望朋友们支持我。