此文是笔者2005年所作《再再论指针》的修订版,与前文相比,本文主要的不同点有如下几点:
一、引用C/C++标准的条款去阐述原理。C与C++标准共有四个已发行的正式版本,分别是C89/C90、C99、C++98和C++2003,为了避免重复的条款引用,在文字或语义相同的情况下,笔者只引用C99的条款,遇到不同的情况时再分别引用。
二、加入了C++的内容。
三、增加或者合并了一些章节,同时修正了一些行文错误。
指针是C/C++的灵魂!它是C/C++众多引人入胜的特性中的一朵奇葩。与底层操作的亲密接触是指针与生俱来的优点,利用指针可以写出许多短小精悍、效率极高的代码。它是C/C++一把无可替代的利器,凭着这把利器,C/C++与其它高级语言相比至少在效率方面胜人一筹。
但是,由于数组与指针的原理与使用方式跟人们通常的思维习惯有较大差别,需要花较多的时间进行消化,这使得对数组与指针的偏见和误解成为了普遍存在的现象,更出现了避免使用指针的思潮,笔者认为这是非常不可取的。指针是如此犀利,正是它才使得C/C++语言威猛无比。如果就这样把它放弃了,那么C/C++就算是白学了。我们应当让指针成为你手中那把砍掉索伦手指上魔戒的举世无双的纳西尔圣剑,而不是你心中永远的魔戒。
与众多初学者一样,笔者对数组与指针的理解也经历了漫长的过程。初学C的时候,笔者作为谭书的受害者之一,与其它初学者一样脑袋中充满了对数组与指针各种各样的误解。后来随着对C/C++理解的深入,逐渐发现谭书中存在大量的谬误与漏洞,从此开始了纠偏的历程。这是一段痛并快乐着的过程,痛是由于愤恨被谋杀了一段宝贵的时光,快乐是因为重新找到了方向,相信不少朋友也曾有过跟笔者相似的体会。在这段时间里,笔者查阅了大量的资料,也耗费了大量的时间进行深刻的思考,还跟同事、朋友、网友进行了大量的辩论,特别是2005年,几乎整整一年的时间都是在激烈的辩论中渡过的,当年这些辩论的激烈程度到现在还记忆犹新,如果当时手里有把枪的话,我想我会开枪的!经过不断的思考、辩论、印证,再思考、再辩论、再印证,数组与指针的迷雾终于逐渐清晰了起来。
本文的目的,是希望通过跟各位朋友一起讨论关于数组与指针的几个关键概念及常见问题,加深对数组与指针的理解。笔者不敢奢望能够完全解开你心中的魔结,但如果通过阅读本文,能够让你在日后的数组与指针使用过程中减少失误,笔者就心满意足了。
当你阅读本文后:
如果你有不同的意见,欢迎你在评论里留下自己的见解,笔者很乐意跟你一起讨论,共同进步。
如果你觉得我说的全都是废话,那么恭喜你,你的指针已经毕业了。
如果你有太多不明白的地方,那么我介绍你先找一些关于数组与指针的读物看看,笔者推荐你阅读一本叫《C与指针》的书,看完后再回来继续思考你的问题。