内容简介
全书分为准备篇、基础篇、揭秘篇、实战篇。本书力求从底层实现机制进行解析,同时配合C/C++编程技巧以及某些指针运用技巧,讲解如何提高程序效能,如何避免滥用指针。
准备篇中介绍C指针概述、UBUNTU及开发环境配置、AT&T汇编简介、编译原理基础;基础篇将对AT&T汇编以及C指针基础进行介绍;揭秘篇讲述高级C指针的实现机制以及C++指针实现机制,同时讲解编程技巧和C/C++指针高级应用;实战篇讲解解释语言指针、TCC编译实践、垃圾回收等高级C指针应用话题。
目录
前言
第一篇 准备篇
第1章 C语言概述 2
1.1 C语言的起源与发展 2
1.2 C语言特性 3
1.3 开发环境搭建 4
1.3.1 Windows开发环境 4
1.3.2 UNIX/Linux开发环境 13
1.3.3 随书网盘的开发环境 33
1.4 hello,world 38
1.5 小结 43
第2章 C语言快速入门 44
2.1 C语言的语法特点 44
2.2 猜数字游戏 45
2.2.1 编写输入数字的C代码 46
2.2.2 限制输入数字的范围 46
2.2.3 引入循环机制,允许重新输入 48
2.2.4 产生1~500以内的随机整数 50
2.2.5 反复接收玩家输入,直到猜中数字为止 52
2.2.6 自动猜数算法 54
2.3 小结 57
第3章 AT&T汇编概述 58
3.1 AT&T汇编基础 58
3.1.1 IA-32指令 58
3.1.2 汇编的作用 59
3.1.3 AT&T汇编语言的特点 59
3.1.4 第一个AT&T汇编 61
3.2 程序运行机制 64
3.3 小结 65
第二篇 基础篇
第4章 指针基础 68
4.1 C指针概述 68
4.2 C指针基础 69
4.2.1 指向标量的C指针 69
4.2.2 指向数组的C指针 73
4.2.3 指针数组 75
4.2.4 函数参数中使用指针 82
4.2.5 常量指针 85
4.2.6 函数指针 88
4.2.7 文件指针 91
4.3 小结 98
第5章 C开发基础 99
5.1 编译与调试C程序 99
5.1.1 GCC与GDB 99
5.1.2 make工具与makefile 104
5.2 GLib函数库 107
5.2.1 GLib简述 107
5.2.2 GLib基础 110
5.2.3 GLib数据类型及标准宏 118
5.3 内存管理 120
5.3.1 glibc的内存管理 120
5.3.2 内存分配机制 121
5.3.3 内存回收 125
5.4 Ncurses库 137
5.4.1 Ncurses简述 137
5.4.2 Ncurses基础 137
5.4.3 Ncurses实例:文字编辑器 154
5.5 小结 181
第三篇 进阶篇
第6章 C开发技巧集锦 184
6.1 递归 184
6.1.1 递归概述 184
6.1.2 斐波那契数列 184
6.1.3 brainfuck解释器 186
6.2 字符串操作 196
6.2.1 复制并截断字符串 196
6.2.2 字符串拼接 197
6.2.3 在内存中复制字符串 197
6.2.4 目录的尾部位置 197
6.2.5 查找文件扩展名 198
6.3 加法溢出 198
6.3.1 溢出原理 198
6.3.2 溢出应用 199
6.4 编译信息的预定义宏 200
6.4.1 __FILE__与__LINE__ 201
6.4.2 #line与#error 201
6.5 C与汇编语言混合编程 202
6.5.1 寄存器 203
6.5.2 变量存储分配 204
6.5.3 汇编指令概述 205
6.5.4 C编译执行原理 207
6.5.5 汇编调用C库函数 209
6.5.6 C内联汇编 210
6.6 小结 216
第7章 C并行与网络基础 217
7.1 多进程、多线程基础 217
7.1.1 多进程编程 218
7.1.2 多线程委托模型 220
7.1.3 分离线程 222
7.1.4 取消线程 224
7.1.5 多线程竞争域 230
7.1.6 线程互斥对象 232
7.1.7 线程专有数据 239
7.1.8 消息队列 241
7.2 C网络基础 245
7.2.1 TCP基础 245
7.2.2 TCP编程基础 245
7.2.3 TCP编程示例 248
7.3 小结 254
前言/序言
为什么要写这本书
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语言的朋友。
刘兴
中国,湖南