0-2 读者对象与内容结构
本书的读者对象为:
- 粗略地读过 C 语言的入门书,但对指针还是不太理解的人。
- 平时能够对 C 语言运用自如,但实际上对指针理解得还不够透彻的人。
本书并非 C 语言的入门书,所以关于编译方法、if
语句等就不进行说明了。很抱歉,有这方面学习需求的朋友请自行购买其他书。
本书的内容结构如下所示。
第 1 章:打好基础——预备知识和复习
第 2 章:做个实验——C 语言是怎样使用内存的
第 3 章:语法揭秘——它到底是怎么回事
第 4 章:数组和指针的常见用法
第 5 章:数据结构——指针的真正用法
第 6 章:其他——拾遗
第 1 章和第 2 章主要面向初学者,从“指针就是地址”这个观点开始讲解。
地址是一个通过 printf()
即可亲自确认其实际值的概念,非常具体且容易理解。通过在自己的机器上实际输出指针的值,可以相对简单地领悟指针的概念。
首先,第 1 章会对 C 语言的发展过程(C 是怎样“沦落”到现在这种样子的)、指针以及数组进行说明。
初学者一定会感到纳闷:为什么非用指针这个东西不可呢?有些入门书甚至将 a[i]
这样已经用数组写好的程序,特地重写成 *p++
这样的指针运算形式,还说什么“这才是 C 语言的风格”。
C 语言的风格?或许的确可以这么说,但是以此为由炮制出来的难懂的写法,到底好在哪里?什么?执行效率高?这是真的吗?
产生这些疑问是正常的,甚至可以说,这么想就对了。
一些老的 C 语言书(特别是 1-1 节提到的 C 语言“圣经”K&R*)多以使用指针运算的程序作为例题进行讲解,但实际上,如今看来非常地晦涩难懂。而了解了 C 语言的发展过程,就能理解 C 语言为什么会有指针运算这样奇怪的功能。
* K&R 指的是《C 程序设计语言》一书。——编者注
除此之外,我们还会讲到初学者前进路上的绊脚石——数组和指针的那些容易让人混淆的语法。
第 2 章将介绍 C 语言实际上是怎样使用内存的。
这里同样采用直观的方式将地址输出。请有 C 语言运行环境的读者务必实际输入示例程序,并尝试运行。
对于普通的局部变量、函数的参数、static
变量、全局变量和字符串字面量(用 ""
引住的字符串)等,了解了它们在内存中是如何保存的,就可以理解 C 语言的各种行为。
遗憾的是,大部分 C 语言程序甚至可以说完全没有执行运行时检查。如果在写入时发生数组越界,立刻就会引发内存损坏。虽然这类 Bug 很难避免,但知道了 C 语言怎样使用内存之后,至少可以在一定程度上推断出这类 Bug 的原因。
第 3 章将介绍与数组和指针相关的 C 语言语法。
C 语言到底为什么总被人抱怨“指针很难”呢?我们已经多次提到过,“指针就是地址”这个说法其实挺容易理解的,之所以说指针难,主要是因为 C 语言中数组和指针的语法太过混乱。
C 语言的语法乍一看比较严谨,实际上却存在很多例外情形。
那些我们常用的语法究竟是遵循什么规则运用的?哪些语法需要特殊对待?对于这些问题,第 3 章中将给出明确的回答。
那些自认为是 C 语言老手的读者,请信我一次,务必读一读第 3 章。
第 4 章是实践篇,将举例说明数组和指针的常见用法。理解了这部分内容,对付大多数程序应该不成问题。
对于第 4 章所举的例子,经常使用 C 语言的读者可能会很熟悉。但是,即便是平时都在使用这里介绍的写法的读者,对语法的理解也并不一定透彻,或者大多数情况下只是照着以前见过的代码“依葫芦画瓢”罢了。
读完第 3 章再读第 4 章的话,对于那些用惯了的写法,你会发现:“哦,原来是这个意思啊!”
另外,初学者就能够理解“指向指针的指针”(也有人称之为双指针)等并不是什么高深莫测的东西,只是单纯地将指针的用法组合起来了而已。
第 5 章将介绍指针真正的用法——数据结构的基础。
到第 4 章为止所举的例子基本上都是 C 语言所特有的,而第 5 章会涉及其他语言里也有的指针的话题。
无论使用什么语言,数据结构都是重中之重。在用 C 语言构造数据结构时,结构体和指针起到了至关重要的作用。
如果读者在学习 C 语言时不仅觉得指针难懂,连结构体也搞不太清楚,请务必阅读这一章。
第 6 章将对前几章未覆盖到的知识点进行补充说明,列举一些陷阱以及惯用语法。
本书与其他同类书相比,相当注重语法细节。
说到语法,不知为何总给人一种“就算不知道也没啥问题”的印象,就像人们经常批判日本的英语教学过于注重语法一样。的确,我们早在学会日语的动词变形之前就已经会说日语了嘛。
但是,C 语言并非日语这样复杂的自然语言,而是一门编程语言。
要按照语法来解释自然语言是很困难的。比如,在你申请客户办公室的访客证时,输入的是“fangkezheng”,却被输入法识别为“房客证”。编程语言只不过是用人类想出来的语法进行编写,并由所谓编译器的程序进行解释而已。
“大家都这么写,那我这么写应该也能跑起来吧!”
这种想法真让人感到些许悲哀呢。
我希望不只是初学者,有一定经验的程序员也务必阅读一下本书。在深入理解了 C 语言的语法之后,对于那些迄今为止一直使用的惯用写法,想必就能够释然接受了吧。
反正都是要用的,那就做到“知其然知其所以然”吧。这样才有益于身心健康嘛。
关于本书的支持页面
本书的支持页面如下所示,书中所用的源代码可以从图灵社区本主页1下载。
对于本书提供的源代码,无论是否用于商用用途,都可以自由地复制、修改、重新发布。但是,为了防止混乱,请在重新发布时注明是修改版。
声明
本书中出现的产品名称等一般为各公司的注册商标或商标。
正文中未使用™和®等对其予以明确标记。
本书仅以提供信息为目的。请读者基于自己的判断使用本书。对于执行本书示例程序导致的损失等,出版社及作译者概不负责,敬请知悉。
1请至“随书下载”处下载本书源代码。另外,关于与本书内容有关的链接,请点击页面下方的“相关文章”查看。——编者注