
前言
为什么要写这本书
C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的D.M.Ritchie于1972年推出。1978年后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序;也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,适用于系统软件开发及嵌入式开发领域,具备很强的数据处理能力,不仅仅是在软件开发上,在各类科研中也都需要用到C语言。
指针是C语言中广泛使用的一种数据类型,是C语言中功能强大而又让人迷惑的亮点,运用指针编程是C语言最主要的风格之一。作为一把双刃剑,C指针让C语言成了能编写操作系统的接近硬件层的语言,能让编程者实现很多其他语言实现不了的功能;但是有时编程者也会感到无所适从,因为稍有不慎,就将造成内存泄漏、指针越界、指针类型错误等异常情况。而汇编中间码揭示了内存如何分配和使用、翻译形成的底层语言如何工作等,通过分析汇编中间码,揭开隐藏在C语言背后的秘密,剖析“C指针作为内存里的一个地址”这一事实。
C指针本质及其实现机制非常重要,为了让编程者更好地掌握这把“双刃剑”,本书从指针基础讲解入手,由浅入深,最后分析了汇编及底层语言,全面剖析了C指针。
读者对象
·程序员。C/C++程序员能在充分理解C指针以及指针实现机制的基础上,开发软件系统的中间件、核心库,评估内存占用、运行效率、突发异常、程序后门等情况,提高软件质量,增加可移植性,进行编译优化;而对占用CPU时间较多的代码可用汇编语言代替,提高软件运行速度。在受限环境(嵌入开发、并行计算、冗余系统等)下,正确使用C指针以及评估软件运行质量,能促使编写的代码更稳定、更安全、更高效。脚本语言程序员也能从C指针中收获很多,Python、Perl等脚本语言都能与C/C++混合编程。
·架构师。指针是C/C++语言的基石,任何复杂的算法和大型甚至云计算软件系统都是基于这些基石构造的,只有掌握好系统的底层,才能提高系统整体运行效率。架构师在理解C/C++指针以及实现机制的基础上,能根据软件运行环境定制适合软件需求的架构,每种软件架构在内存分配、程序运行等方面都有自己的使用策略。目前,随着大数据时代的来临,云计算平台发展很快,C/C++语言编程质量的改进能提高云计算中单机的运行效率和稳定性,能优化数据在云计算网络的传输效率。
·算法工程师。近年来,随着国内计算机行业的发展,数据挖掘、机器学习、算法工程、云计算、编译工程、芯片工程等新生事物相继出现,这些以前仅在高校和科研院所研究的技术需要算法工程师的努力才能成为现实,而掌握诸如指针等编程知识是实现算法的基础。
如何阅读本书
全书分为准备篇、基础篇、进阶篇。指针及相关内容是编程语言中较难理解的部分,脚本语言稍好些,C/C++语言中会更加明显。虽然理解指针本身并不复杂,但指针之间的组合以及指针的灵活运用却存在不同的技巧,不同的组合能产生不同的效果,也有着不同的作用。本书力求从底层实现机制进行解析,同时配合C/C++编程技巧以及某些指针运用技巧,讲解如何提高程序效能,如何避免滥用指针。
本书首先从在C语言编程的角度讲解C指针,力图使读者学会运用C指针进行开发,并能进一步灵活将指针运用在精巧的算法上,构造更复杂的软件系统。
接着,对C语言标准进行讲述。C语言属于高级语言,广泛采用的有C89和C99这两个主要标准。C89于1989年以ANSI X3.159—1989“Programming Language C”名称发布生效,这个版本的语言经常被称作ANSI C,或C89;C99在C89的基础上新增了一些特性,作为C语言官方标准的第2版,于1999年以ISO/IEC 9899:1999“Programming Language-C”名称发布生效,并于2000年3月被ANSI采纳。
最后,对编译器的实现原理进行解读。编译器对C语言进行编译,编译后形成可执行文件,针对C/C++语言以编译的形式执行(TCC等提供了一种解释执行C脚本的方式,但其原理和编译执行差不多)的情况,重点从编译器生成的汇编中间码对指针进行剖析。
勘误和支持
由于作者的水平有限,编写的时间也很仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。你在遇到任何问题或有更多的宝贵意见时,欢迎发送邮件至我的邮箱liu.xing.8@foxmail.com,很期待能够听到你的真挚反馈。此外,本书的代码及相关资源请在网盘(网盘地址:https://dwz.cn/uo3gCxWK,提取码:457a)下载,本书读者QQ群为834755376。
致谢
在此,我衷心感谢机械工业出版社华章公司编辑杨福川老师和策划编辑杨绣国老师,由于他们的魄力和远见,让我顺利地完成了全部书稿。
谨以此书献给热爱C语言的朋友。
刘兴
中国,湖南