标题：C语言开发技术详解
宣传语
该书特色：
从入门到精通：上篇介绍C语言基础，下篇介绍了C语言的高级程序设计技巧。
适用双操作系统：Windows+Linux环境。
循序渐进：本书编写顺序按C语言的知识点循序渐进地介绍。
实例丰富，讲解详细：386个实例，方便读者理解相应的知识点。
前言
引子：C语言作为一门最通用的语言，在过去很流行，将来依然会如此。几乎每一个理工科或者其他专业的学生毫不例外地要学习它。记得大学里，很多学校都把谭浩强教授的《C程序设计》作为入门教材，这是绝佳的选择。然而，要更进一步，更全面而深入地学习呢？显然有点力不从心。本书正是为了弥补这个缺憾而写的，希望能对想比较全面而深入学习C语言程序设计的人有所帮助。
从C语言产生到现在，它已经成为最重要和最流行的编程语言之一。在各种流行编程语言中，都能看到C语言的影子，如Java的语法与C语言基本相同。学习、掌握C语言是每一个计算机技术人员的基本功之一。
C语言具有高级语言的强大功能，却又有很多直接操作计算机硬件的功能（这些都是汇编语言的功能），因此，C语言通常又被称为中级语言。学习和掌握C语言，既可以增进对于计算机底层工作机制的了解，又为进一步学习其他高级语言打下了坚实的基础。
本书特点
从入门到精通：本书分上下两篇，上篇针对初学者，从C语言的基础开始，使略有计算机基础的人都能容易地学会C语言编程。下篇则介绍了C语言的高级程序设计技巧，包括常用算法、底层控制鼠标、绘图、加密、压缩等应用。
适用多种操作系统：本书实例都通过GCC编译器调试，读者不仅可在Windows环境下使用本书学习C语言，也可在Linux环境下使用本书学习C语言。
循序渐进：本书编写顺序按C语言的知识点循序渐进地介绍。例如，先介绍数据的存储，再介绍数据的输入/输出；先介绍简单的程序设计概念，再介绍指针等C语言的难点。
重点突出：指针是C语言的重点和难点，本书用了大量的篇幅，从不同方面对其进行讲解，并列举了大量的实例，帮助读者理解并掌握指针。
实例丰富，讲解详细：学习程序设计时，必须要多上机操作。本书对每个知识点都配有实例代码，并对实例代码进行了详细地讲解，在实例后，一般都附有实例程序的运行结果，方便读者对比理解相应的知识点。
注重实用：在本书下篇，详细介绍了数据加密、压缩、控制鼠标、绘制图形等实用程序。通过这些内容，可进一步提高读者C语言的应用能力。
实用超值的DVD光盘：为帮助读者更深入地学习，本书附赠DVD光盘1张，内容包括本书所有的章节实例，入门视频以及长达21小时的C语言学习视频教学课件，讲解关键知识点界面操作，手把手教会读者使用。
本书内容
本书分上下两篇，共26章，上篇共16章，主要介绍C语言的语法基础；下篇共10章，主要介绍C语言的高级程序设计。各章内容如下：
第1章为C语言概述，介绍了C语言的发展、特点，C语言程序的开发过程，最后，以一个简单的C程序，演示了编写C语言程序的方法。
第2章介绍了一个完整的C程序各部分的含义。
第3章介绍了C语言几种常见的开发环境，包括Dev-C++、Visual C++、Linux下C语言开发环境的使用等内容。
第4章介绍了C语言数据的表示方法，包括数据的存储、常量、变量、整数类型、字符类型、实数类型、混合运算及类型转换、C99新增数据类型等内容。
第5章详细介绍C语言中的表达式、各种运算符及运算优先级、C语言各类语句等内容。
第6章介绍了格式化输入/输出函数的使用，包括printf函数、scanf函数、getchar函数、getch函数、gets函数、putch函数、puts函数等的使用。
第7章介绍C语言分支结构程序设计的方法，包括使用if语句、嵌套if语句、if else if语句、switch语句等进行多种分支程序设计的内容。
第8章介绍C语言循环结构程序设计的方法，包括使用编写while循环、for循环，以及循环嵌套等内容。
第9章介绍在C语言中使用数组的方法，主要介绍了一维数组、二维数组、字符数组和字符串的使用。
第10章介绍在C语言中创建和使用函数的方法，包括函数的概念、编写函数、设置函数的参数、函数调用、递归函数的编写等内容。
第11章介绍模块化程序设计方法，包括模块化程序设计概念、C程序的组织、变量的作用域、变量的存储类型等内容。
第12章介绍C语言中指针的使用，指针是C语言最显著的特征。本章首先介绍变量在内存中的保存形式，然后介绍了指针和简单变量、指针和数组、指向多维数组的指针、指针和字符串、指针数组、指针和函数等内容。
第13章介绍结构、联合和枚举，包括结构的概念、结构的嵌套、结构数组、结构指针、向函数传递结构、联合、枚举等内容。
第14章介绍位运算和位域的使用，通过位运算符，可以方便地操作二进制位。
第15章介绍文件输入/输出的方法，主要介绍了数据流的概念、文件的打开与关闭、从文件中读写字符、从文件中读写字符串、二进制文件的读写、文件检测函数、文件的随机读写、管理缓冲区、输入/输出的重定向、文件管理等内容。
第16章介绍编译预处理，包括宏定义命令、条件编译、其他预处理命令、内联函数等内容。
第17章介绍处理字符串的方法，包括字符串的存储、字符和字符串检测函数、查找字符串、比较字符串、连接字符串、复制字符串、字符和字符串的转换等内容。
第18章介绍C语言的数学函数和时间函数，使用这些函数，可方便地处理数值、日期时间等类型的数据。
第19章介绍常用算法的C语言程序，包括用C语言编写的完成排序、查找、队列、堆栈、链表等程序。 
第20章介绍用C语言进行存储管理的方法，包括内存动态分配和回收等内容。
第21章介绍用C语言编写鼠标的底层操作函数，包括初始化鼠标、复位鼠标、显示鼠标指针、隐藏鼠标指针、获取按钮信息等操作鼠标的底层函数。
第22章介绍用C语言编写数据加密程序的方法，如换位加密法、替换加密法、位加密法等程序的编写，最后，还简单介绍了MD5算法。
第23章介绍用C语言编写数据压缩程序的方法，首先，介绍了数据压缩基础，最后，详细介绍了LZW压缩算法的原理及实现过程。
第24章介绍C语言底层图形函数的编程，首先介绍了显示系统的基本概念，然后介绍了直接读取显存编写图形函数的方法，在此基础上，完成绘制线、圆、矩形、多边形等函数，最后还介绍了编辑图形的方法。
第25章介绍GCC调用汇编程序的方法，包括AT&T汇编简介、GCC内嵌汇编、调用汇编程序等内容。
第26章为一个用C语言编写的信息管理系统——员工管理系统，通过该实例程序的编写，可巩固本书前面各章所学内容。
读者对象
程序设计初学者入门
大中院校学生
大中院校教师
C程序员
电脑培训班
计算机爱好者
由于计算机技术发展很快，且编者水平和学识有限，书中难免有疏漏之处，敬请广大读者朋友批评指正，并多提出宝贵意见。
编 者
目录
第1篇  C语言基础
第1章  C语言概述    2
1.1  C语言发展历史    2
1.1.1  C语言发展过程    2
1.1.2  C语言标准    3
1.2  C语言的特点    4
1.2.1  简洁紧凑    4
1.2.2  灵活高效    4
1.2.3  强大的控制结构    5
1.2.4  可移植性    5
1.2.5  C语言的缺点    5
1.2.6  C与C++的关系    6
1.3  C语言程序开发过程    6
1.3.1  定义程序目标    6
1.3.2  设计程序    6
1.3.3  编写源代码    7
1.3.4  编译和链接    7
1.3.5  测试    8
1.3.6  维护和修改    8
1.3.7  总结    8
1.4  创建第一个C程序    9
1.4.1  C程序结构    9
1.4.2  输入程序代码    9
1.4.3  编译链接程序    10
1.4.4  调试程序    11
1.4.5  程序语句的含义    12
第2章  C程序的组成    13
2.1  一个完整的C程序    13
2.1.1  分析程序目标    13
2.1.2  设计程序    13
2.1.3  编写代码    14
2.1.4  编译运行程序    15
2.2  C程序的组成    16
2.2.1  包含指令    16
2.2.2  定义常量    16
2.2.3  声明函数原型    17
2.2.4  main函数    17
2.2.5  程序语句    17
2.2.6  函数定义    18
2.2.7  注释    18
2.3  C程序组成总结    19
第3章  C语言开发环境    20
3.1  C语言开发环境简介    20
3.1.1  C语言开发环境的组成    20
3.1.2  常用开发环境    20
3.2  使用Dev-C++    22
3.2.1  Dev-C++操作界面    22
3.2.2  设置选项    22
3.2.3  用Dev-C++创建C程序    23
3.2.4  编译程序    24
3.2.5  运行Dev-C++编译的程序    25
3.3  使用Visual C++    26
3.3.1  Visual C++操作界面    27
3.3.2  用Visual C++创建C程序    27
3.3.3  编译程序    29
3.3.4  运行Visual C++生成的程序    30
3.4  Linux C语言开发环境    31
3.4.1  Linux C语言开发环境的构成    31
3.4.2  代码编辑器    31
3.4.3  GCC编译器    33
3.4.4  在emacs中编译C程序    33
3.4.5  在Linux中编写C程序    34
第4章  数据的表示    37
4.1  数据的存储    37
4.1.1  内存单元    37
4.1.2  字符的存储    38
4.1.3  数值的存储    38
4.2  数据类型简介    39
4.3  常量    40
4.3.1  直接常量    40
4.3.2  符号常量    40
4.4  变量    42
4.4.1  标识符    42
4.4.2  声明变量    43
4.4.3  变量初始化    45
4.5  整数类型    45
4.5.1  整数类型及存储    45
4.5.2  整型常量的表示    48
4.5.3  整型数据输出    50
4.6  字符类型    53
4.6.1  字符常量    53
4.6.2  字符变量及初始化    53
4.6.3  转义字符    54
4.6.4  字符型数据的输出    55
4.7  实数类型    56
4.7.1  实数类型及存储    56
4.7.2  实型常量的表示    58
4.7.3  实型变量    59
4.7.4  实型数据输出    60
4.8  混合运算及类型转换    61
4.8.1  混合运算    61
4.8.2  强制数据类型转换    63
4.9  C99新增数据类型    64
4.9.1  逻辑型（_Bool）    64
4.9.2  复数类型（_Complex和_Imaginary）    64
4.10  总结    65
第5章  表达式、运算符和语句    66
5.1  表达式    66
5.1.1  简单表达式    66
5.1.2  逗号表达式    66
5.2  运算符    67
5.2.1  运算符概述    68
5.2.2  算术运算符    68
5.2.3  赋值运算符    73
5.2.4  关系运算符    75
5.2.5  逻辑运算符    76
5.2.6  位运算符    78
5.2.7  条件运算符    78
5.2.8  其他运算符    80
5.3  表达式的运算顺序    81
5.3.1  运算符优先级    81
5.3.2  运算符的结合性    82
5.3.3  自增自减运算符注意事项    83
5.4  语句    84
5.4.1  语句书写方式    84
5.4.2  表达式语句    85
5.4.3  空语句    86
5.4.4  复合语句    86
5.4.5  标号语句    87
第6章  格式化输出/输入    88
6.1  格式化输出——printf函数    88
6.1.1  printf函数的格式    88
6.1.2  printf的格式字符    89
6.1.3  修饰符    91
6.1.4  printf函数实例    93
6.1.5  动态设置输出宽度和精度    98
6.1.6  printf函数的返回值    99
6.1.7  理解输出列表    99
6.2  格式化输入——scanf函数    102
6.2.1  scanf函数的格式    102
6.2.2  scanf函数格式字符串    103
6.2.3  scanf函数注意问题    105
6.2.4  scanf函数的返回值    107
6.3  其他常用输入/输出函数    107
6.3.1  getchar函数    108
6.3.2  getch函数    108
6.3.3  gets函数    109
6.3.4  putch函数    110
6.3.5  puts函数    110
第7章  分支结构程序设计    112
7.1  分支程序流程    112
7.2  if语句    113
7.2.1  基本if语句    113
7.2.2  if else语句    116
7.2.3  再论条件表达式    117
7.3  嵌套if语句    117
7.3.1  嵌套if语句的形式    117
7.3.2  if语句嵌套实例    118
7.4  if else if语句    122
7.4.1  if else if语句格式    122
7.4.2  if else if实例    123
7.5  多路分支——switch    123
7.5.1  switch语句格式    123
7.5.2  switch实例    125
7.5.3  使用多重标号    126
7.5.4  switch和if比较    129
第8章  循环结构程序设计    130
8.1  循环结构的程序流程    130
8.2  while循环    131
8.2.1  while语句格式    131
8.2.2  理解循环条件    134
8.2.3  理解循环体    135
8.2.4  while循环需注意的问题    137
8.3  for循环    137
8.3.1  for语句格式    138
8.3.2  for语句的各种样式    139
8.3.3  for语句实例    142
8.4  do while语句    144
8.4.1  while语句不足    144
8.4.2  do while语句格式    146
8.5  循环嵌套    147
8.5.1  了解循环嵌套    147
8.5.2  循环嵌套的结构    149
8.5.3  循环嵌套实例    150
8.6  break和continue语句    154
8.6.1  break语句    154
8.6.2  continue语句    155
8.7  goto语句    157
第9章  使用数组    159
9.1  了解数组    159
9.1.1  使用数组的好处    159
9.1.2  数组的概念    160
9.1.3  数组的维数    161
9.2  一维数组    162
9.2.1  一维数组的声明    162
9.2.2  一维数组的存储    164
9.2.3  引用一维数组    165
9.2.4  一维数组的初始化    167
9.3  二维数组    168
9.3.1  二维数组的声明    169
9.3.2  二维数组的存储    169
9.3.3  二维数组的初始化    173
9.4  字符数组和字符串    174
9.4.1  字符数组    174
9.4.2  了解字符串    175
9.4.3  字符串的输入输出    177
9.5  数组的实例    178
9.5.1  字符串反转    178
9.5.2  查找最大数    179
9.5.3  数据排序    180
第10章  使用函数    183
10.1  函数的概念    183
10.1.1  函数概念    183
10.1.2  函数的分类    184
10.1.3  定义函数    185
10.1.4  main函数    186
10.2  函数的工作过程    187
10.2.1  程序结构    187
10.2.2  函数执行过程    187
10.3  编写函数    188
10.3.1  函数头    188
10.3.2  返回类型    189
10.3.3  参数列表    189
10.3.4  函数体    190
10.3.5  函数原型    190
10.4  函数的参数    192
10.4.1  参数传递过程    192
10.4.2  值调用    192
10.4.3  引用调用    194
10.4.4  数组调用    196
10.4.5  main的参数    198
10.5  函数调用    200
10.5.1  函数调用方式    201
10.5.2  被调函数的说明    201
10.5.3  返回函数结果    203
10.5.4  函数的嵌套调用    204
10.6  递归函数    205
10.6.1  函数的递归调用    205
10.6.2  递归的基本原理    207
10.6.3  递归函数设计    208
10.6.4  递归的优缺点    210
第11章  模块化程序设计方法    211
11.1  模块化程序设计概念    211
11.2  程序模块结构    212
11.2.1  C程序的组织    212
11.2.2  多文件模块的编译链接    213
11.2.3  文件包含    215
11.2.4  内部函数与外部函数    216
11.3  变量的作用域    217
11.3.1  局部变量    217
11.3.2  在复合语句中的变量    218
11.3.3  全局变量    219
11.3.4  全局变量和局部变量同名    222
11.4  变量的存储类型    223
11.4.1  了解存储类型    223
11.4.2  自动变量    224
11.4.3  寄存器变量    225
11.4.4  外部变量    226
11.4.5  静态变量    227
11.5  函数、文件、变量的关系    229
第12章  使用指针    230
12.1  内存和变量    230
12.1.1  计算机内存    230
12.1.2  变量的存储    231
12.2  指针和简单变量    232
12.2.1  指针的概念    232
12.2.2  创建指针    233
12.2.3  初始化指针    234
12.2.4  使用指针    235
12.2.5  给函数传递指针    238
12.3  指针和数组    239
12.3.1  指针、数组和地址间的关系    239
12.3.2  指针运算    241
12.3.3  用指针操作数组元素    242
12.4  指向多维数组的指针    245
12.4.1  理解二维数组的地址    245
12.4.2  多维数组的指针表示    247
12.4.3  指向多维数组的指针变量    248
12.4.4  数组名作为函数的参数    252
12.4.5  指向数组的指针小结    255
12.5  指针和字符串    256
12.5.1  字符串的指针表示    256
12.5.2  字符串指针作函数参数    258
12.5.3  字符数组和字符指针的区别    259
12.6  指针数组    260
12.6.1  指针数组的概念    261
12.6.2  用指针数组处理字符串    263
12.6.3  指针数组作函数参数    264
12.7  指向指针的指针    266
12.7.1  理解指向指针的指针    266
12.7.2  二级指针变量与数组    268
12.8  指针和函数    272
12.8.1  返回指针的函数    272
12.8.2  指向函数的指针    274
12.9  指针和const    276
12.9.1  用const控制指针    277
12.9.2  const的几种特殊用法    277
12.10  指针总结    278
12.10.1  明确分辨各种指针类型    278
12.10.2  理解指针的4项内容    279
第13章  结构、联合和枚举    280
13.1  结构的概念    280
13.1.1  定义结构类型    280
13.1.2  定义结构变量    281
13.1.3  使用结构变量    282
13.2  结构的嵌套    284
13.2.1  包含数组的结构    284
13.2.2  包含指针的结构    285
13.2.3  包含结构的结构    285
13.3  初始化结构变量    288
13.4  结构数组    289
13.4.1  结构数组的定义和引用    290
13.4.2  结构数组的初始化    291
13.4.3  结构数组实例    291
13.5  结构指针    292
13.5.1  定义结构指针    292
13.5.2  使用结构指针    293
13.5.3  用指针处理结构数组    294
13.6  向函数传递结构    295
13.6.1  传递结构变量的值    295
13.6.2  传递结构指针到函数    296
13.7  联合    297
13.7.1  定义联合类型    297
13.7.2  使用联合变量    298
13.7.3  在结构中嵌套联合类型    298
13.8  枚举    300
13.8.1  定义枚举类型    300
13.8.2  使用枚举变量    301
13.9  使用typedef    301
第14章  位运算和位域    303
14.1  了解二进制数    303
14.1.1  数据的存储    303
14.1.2  整数的二进制表示    304
14.1.3  实数的二进制表示    305
14.1.4  使用其他进制    305
14.2  位运算    307
14.2.1  位逻辑运算符    307
14.2.2  移位运算符    309
14.2.3  位运算的复合赋值运算符    310
14.2.4  位运算的用途    310
14.3  位域    311
14.3.1  定义位域结构    311
14.3.2  位域的使用    312
14.3.3  位域与联合的使用    314
第15章  文件输入/输出    316
15.1  文件与数据流    316
15.1.1  程序的输入/输出概念    316
15.1.2  流的概念    316
15.1.3  预定义的流    317
15.1.4  文件的基本概念    317
15.1.5  缓冲文件系统    318
15.2  文件的打开与关闭    318
15.2.1  文件指针    319
15.2.2  打开文件函数——fopen    319
15.2.3  关闭文件函数——fclose    321
15.3  从文件中读写字符    322
15.3.1  写字符函数——putc和fputc    322
15.3.2  读字符函数——getc和fgetc    323
15.3.3  合并文件    325
15.4  从文件中读写字符串    326
15.4.1  写字符串函数——fputs    326
15.4.2  读字符串函数——fgets    327
15.4.3  文件格式输出函数——fprintf    328
15.4.4  文件格式输入函数——fscanf    330
15.5  二进制文件的读写    332
15.5.1  写入整型数据函数——putw    332
15.5.2  读取整型数据函数——getw    333
15.5.3  写数据块函数——fwrite    333
15.5.4  读数据块函数——fread    335
15.5.5  文件检测函数    337
15.6  文件的随机读写    337
15.6.1  获取当前位置函数——ftell    337
15.6.2  重置文件位置指针函数——rewind    339
15.6.3  设置文件位置指针——fseek函数    340
15.7  管理缓冲区    342
15.8  输入/输出的重定向    343
15.8.1  操作系统的重定向功能    344
15.8.2  重定向输出    344
15.8.3  重定向函数——freopen    345
15.9  文件管理    346
15.9.1  重命名文件    346
15.9.2  删除文件    347
15.9.3  复制文件    348
15.9.4  创建临时文件    349
第16章  预处理    351
16.1  预处理简介    351
16.1.1  预处理功能    351
16.1.2  预处理命令    351
16.2  宏定义命令——#define    352
16.2.1  无参数的宏    352
16.2.2  带参数的宏    354
16.2.3  预处理操作符#和##    355
16.3  条件编译    357
16.3.1  使用#if    357
16.3.2  使用#ifdef和#ifndef    359
16.3.3  使用#defined和#undef    360
16.4  其他预处理命令    361
16.4.1  预定义的宏名    361
16.4.2  重置行号和文件名命令——#line    361
16.4.3  修改编译器设置命令——#pragma    362
16.4.4  产生错误信息命令——#error    362
16.5  内联函数    362
第2篇  C语言高级程序设计
第17章  处理字符串    365
17.1  字符串的存储    365
17.1.1  字符串的静态存储    365
17.1.2  字符串的动态存储    366
17.2  字符和字符串检测函数    368
17.2.1  字符检测函数简介    368
17.2.2  检测字符串长度函数——strlen    369
17.3  查找字符串    370
17.3.1  查找字符位置——strchr    370
17.3.2  查找相同字符——strspn    372
17.3.3  查找包含字符位置——strcspn    372
17.3.4  查找包含字符——strpbrk    373
17.3.5  查找子串——strstr    375
17.4  比较字符串    376
17.4.1  比较字符串——strcmp    376
17.4.2  比较部分字符串——memcmp    377
17.4.3  比较时忽略大小写——stricmp    379
17.5  连接字符串    380
17.5.1  连接字符串——strcat    380
17.5.2  连接部分字符——strncat    382
17.6  复制字符串    383
17.6.1  复制字符串——strcpy    383
17.6.2  复制部分字符——strncpy    384
17.6.3  更省事的复制函数——strdup    385
17.7  字符和字符串的转换    386
17.7.1  大小写字符的转换    386
17.7.2  转换大小写字符串    387
17.7.3  字符串与数值的转换    388
17.8  其他字符串函数    389
17.8.1  字符串反转——strrev    389
17.8.2  替换字符串中的字符——strset    390
17.8.3  分解字符串——strtok    391
第18章  数学函数和时间函数    393
18.1  数学函数    393
18.1.1  三角函数    393
18.1.2  双曲三角函数    394
18.1.3  指数函数和对数函数    395
18.1.4  其他数学函数    398
18.2  日期时间函数    399
18.2.1  表示日期时间的数据结构    399
18.2.2  获取日期时间    400
18.2.3  转换日期时间的表示形式    401
18.2.4  格式化日期时间    404
第19章  常用算法应用    408
19.1  排序    408
19.1.1  排序概述    408
19.1.2  冒泡排序法    409
19.1.3  选择排序法    410
19.1.4  插入排序法    411
19.1.5  Shell排序法    412
19.1.6  快速排序法    413
19.1.7  字符串的排序    414
19.2  查找    416
19.2.1  顺序查找    416
19.2.2  折半查找    417
19.3  队列    418
19.3.1  队列的概念    418
19.3.2  队列的操作    419
19.4  堆栈    422
19.4.1  堆栈的概念    422
19.4.2  堆栈的实现    422
19.5  链表    424
19.5.1  链表的概念    424
19.5.2  链表的基本操作    425
19.5.3  测试链表的功能    430
第20章  存储管理    432
20.1  内存组织方式    432
20.1.1  内存组织方式    432
20.1.2  堆和栈的比较    433
20.2  C语言的动态存储管理    434
20.2.1  分配内存函数——malloc    434
20.2.2  另一个分配内存的函数——calloc    436
20.2.3  调整已分配内存——realloc    437
20.2.4  释放分配的内存——free    439
20.2.5  丢失的内存    440
第21章  控制鼠标    442
21.1  鼠标驱动程序    442
21.1.1  通过中断访问鼠标驱动程序    442
21.1.2  新的开发环境    443
21.1.3  调用中断服务    444
21.2  鼠标库函数    445
21.2.1  定义头文件mouse.h    445
21.2.2  通过中断控制鼠标    446
21.2.3  初始化鼠标    447
21.2.4  复位鼠标    447
21.2.5  移动鼠标    448
21.2.6  显示鼠标指针    448
21.2.7  隐藏鼠标指针    449
21.2.8  获取按下按钮信息    449
21.2.9  获取释放按钮信息    450
21.2.10  获取鼠标状态信息    451
21.2.11  获取鼠标指针位置信息    451
21.2.12  保存鼠标指针位置    452
21.2.13  捕获键盘或鼠标    452
21.2.14  鼠标指针区域    453
21.3  鼠标应用实例    454
21.3.1  了解屏幕函数    454
21.3.2  实例程序    455
第22章  数据加密    458
22.1  密码技术的概念    458
22.2  加密方法    458
22.2.1  换位加密法    459
22.2.2  替换加密法    462
22.2.3  位加密法    464
22.3  MD5加密简介    466
22.3.1  MD5简介    466
22.3.2  MD5算法描述    467
第23章  数据压缩    469
23.1  数据压缩基础    469
23.1.1  数据压缩概述    469
23.1.2  数据压缩相关概念    469
23.1.3  常见压缩算法简介    470
23.2  LZW原理    471
23.2.1  LZW的相关概念    471
23.2.2  LZW压缩过程    471
23.2.3  LZW解压缩过程    473
23.3  LZW实现代码    473
23.3.1  程序构思    473
23.3.2  定义数据结构    474
23.3.3  压缩函数    474
23.3.4  搜索哈希表    476
23.3.5  输出压缩数据    477
23.3.6  解压缩函数    478
23.3.7  输入编码数据    480
23.3.8  解码函数    480
23.3.9  主程序    481
第24章  图形编程    483
24.1  显示系统简介    483
24.1.1  显示系统基本概念    483
24.1.2  显示卡种类    484
24.1.3  显示模式    484
24.2  绘图基础    486
24.2.1  设置显示模式    486
24.2.2  控制显示缓冲区    487
24.3  图形函数    488
24.3.1  绘制点    488
24.3.2  读取点的信息    489
24.3.3  绘制直线    489
24.3.4  绘制矩形    491
24.3.5  绘制圆    492
24.3.6  绘制多边形    493
24.4  编辑图形    494
24.4.1  复制图形    494
24.4.2  移动图形    495
24.4.3  保存图形    495
24.4.4  载入图形    496
第25章  调用汇编程序    498
25.1  AT&T汇编简介    498
25.1.1  了解汇编的两种格式    498
25.1.2  将C语言输出为汇编程序    500
25.2  GCC内嵌汇编    501
25.2.1  基本内联汇编    501
25.2.2  扩展内联汇编    501
25.2.3  内联汇编实例    505
25.3  调用汇编程序    507
25.3.1  C编译程序的调用约定    507
25.3.2  C语言调用汇编的结构    508
25.3.3  建立汇编函数的框架    509
25.3.4  调用汇编函数    510
第26章  程序设计实例    512
26.1  程序分析    512
26.1.1  模块划分    512
26.1.2  设计数据结构    513
26.2  头文件    514
26.3  主模块    515
26.3.1  main函数    515
26.3.2  检查初始化状态    516
26.3.3  检查登录密码    517
26.3.4  从文件创建链表    518
26.3.5  显示主菜单    519
26.3.6  将链表保存到文件    522
26.4  输入员工信息    523
26.5  查询员工信息    525
26.5.1  查询子菜单    525
26.5.2  查询函数    527
26.5.3  通用显示函数    528
26.6  显示员工信息    529
26.7  修改员工信息    530
26.7.1  修改子菜单    530
26.7.2  修改数据    532
26.8  删除员工信息    533
26.9  统计员工信息    535
26.10  重设系统密码    535
附录A  ASCII关键字    537
附录B  ANSI C关键字    540
实例目录       
【程序1-1】第一个C语言程序    9
【程序2-1】C语言程序组成示例    14
【程序3-1】欢迎程序    25
【程序4-1】符号常量示例    40
【程序4-2】摄氏温度转换为华氏温度    44
【程序4-3】整型数据所占内存空间的大小    46
【程序4-4】整型数据输出示例    51
【程序4-5】整数转换为十六进制和八进制示例    52
【程序4-6】使用转义字符示例    55
【程序4-7】字符型数据输出示例    56
【程序4-8】实数类型占用的字节示例    57
【程序4-9】实型数据输出示例1    59
【程序4-10】实型数据输出示例2    60
【程序4-11】实型数据输出示例3    61
【程序4-12】char类型和int类型之间的转换示例    62
【程序4-13】将float转换为int类型示例    62
【程序4-14】强制类型转换示例    63
【程序4-15】复数操作示例    64
【程序5-1】输出逗号表达式的结果    67
【程序5-2】十进制数转换为二进制数示例（不使用循环）    69
【程序5-3】十进制数转换为二进制数示例（使用循环）    70
【程序5-4】自增运算符的后缀模式和前缀模式    71
【程序5-5】使用复合赋值运算符    75
【程序5-6】关系运算符示例    76
【程序5-7】逻辑运算符示例    77
【程序5-8】条件运算符示例    79
【程序5-9】使用sizeof运算符    80
【程序6-1】printf函数示例    89
【程序6-2】printf函数不同格式串输出示例    90
【程序6-3】printf函数输出最小宽度控制示例    91
【程序6-4】printf函数输出精度控制示例    92
【程序6-5】printf函数输出字符示例    94
【程序6-6】printf函数输出整数示例    95
【程序6-7】printf函数输出实数示例    96
【程序6-8】printf函数输出字符串示例    97
【程序6-9】printf函数动态设置输出宽度和精度示例    98
【程序6-10】printf函数的返回值示例    99
【程序6-11】printf函数输出列表示例1    100
【程序6-12】printf函数输出列表示例2    100
【程序6-13】scanf函数示例    102
【程序6-14】scanf函数不能控制输入精度示例    105
【程序6-15】scanf函数使用非格式字符示例    106
【程序6-16】scanf函数返回值示例    107
【程序6-17】getchar函数示例    108
【程序6-18】getch函数示例    109
【程序6-19】gets函数示例    109
【程序6-20】putch函数示例    110
【程序6-21】puts函数示例    111
【程序7-1】用if语句求最大数    114
【程序7-2】用if语句对两个数排序    115
【程序7-3】用if else语句对两个数排序    116
【程序7-4】检查输入字符类型示例（if语句嵌套）    119
【程序7-5】三个数排序示例（if语句嵌套方法）    120
【程序7-6】三个数排序示例（交换方法）    121
【程序7-7】检查输入字符类型示例（if else if语句）    123
【程序7-8】整数转换为中文星期名称（switch语句）    125
【程序7-9】switch语句多重标号示例（错误结果）    126
【程序7-10】分档计算运费（switch语句）    127
【程序8-1】求连续自然数之和示例（while语句，计数器递增）    132
【程序8-2】求连续自然数之和示例（while语句，计数器递减）    134
【程序8-3】求连续自然数之和示例（优化后的代码）    135
【程序8-4】求连续自然数之和示例（for语句）    139
【程序8-5】省略初始化部分的for循环示例    139
【程序8-6】改变for循环的循环变量递增方式示例    141
【程序8-7】用for循环输出指定期间的字符示例    142
【程序8-8】用for循环输出ASCII代码表示例    143
【程序8-9】用while循环显示菜单示例    144
【程序8-10】用do while循环显示菜单示例    146
【程序8-11】循环嵌套输出示例    148
【程序8-12】九九乘法表    150
【程序8-13】九九乘法表示例（优化后的代码）    151
【程序8-14】百钱买百鸡示例（循环嵌套）    152
【程序8-15】百钱买百鸡代码优化示例    153
【程序8-16】用break语句跳出循环示例    155
【程序8-17】用continue语句跳过循环部分语句示例    156
【程序8-18】用goto语句编写循环代码示例    157
【程序9-1】统计学生成绩示例（不使用数组）    159
【程序9-2】统计学生成绩示例（使用数组）    160
【程序9-3】使用变长数组示例（C99标准）    163
【程序9-4】越界访问数组示例    166
【程序9-5】输出未初始化的数组元素示例    167
【程序9-6】按线性方式输出二维数组元素示例    170
【程序9-7】输出数组各元素的内存地址示例    171
【程序9-8】字符数组示例    175
【程序9-9】输出字符数组示例    177
【程序9-10】字符串反转示例    179
【程序9-11】输出数组中的最大数示例    180
【程序9-12】数组元素排序示例    181
【程序10-1】求最大值函数示例    185
【程序10-2】函数返回值示例    189
【程序10-3】函数返回值示例    191
【程序10-4】函数的值调用示例    193
【程序10-5】函数的引用调用示例    194
【程序10-6】通过指针传递参数示例    195
【程序10-7】函数的数组调用示例    197
【程序10-8】main函数的参数示例    199
【程序10-9】输出用户输入的命令行参数示例    200
【程序10-10】函数嵌套调用示例    204
【程序10-11】函数递归调用示例    205
【程序10-12】汉诺塔（递归程序示例）    208
【程序11-1】引用多个源程序文件示例    213
【程序11-2】局部变量示例    217
【程序11-3】复合语句中的变量示例    219
【程序11-4】全局变量示例1    220
【程序11-5】全局变量示例2    221
【程序11-6】同名全局变量和局部变量示例    222
【程序11-7】自动变量示例    224
【程序11-8】寄存器变量示例    226
【程序11-9】外部变量示例    226
【程序11-10】静态变量示例    228
【程序12-1】查看变量地址示例    232
【程序12-2】错误初始化指针示例    235
【程序12-3】取地址运算符和取内容运算符示例    236
【程序12-4】用指针引用变量示例    237
【程序12-5】通过指针交换数据示例    237
【程序12-6】指针和数组地址之间的关系示例    240
【程序12-7】用指针操作数组元素示例    242
【程序12-8】将指针作为数组名使用示例    243
【程序12-9】输出数组的地址和长度示例    245
【程序12-10】输出数组各维的地址和长度示例    246
【程序12-11】输出数组各元素的地址和长度示例    247
【程序12-12】初始化二维数组示例    248
【程序12-13】用指针变量初始化二维数组示例    249
【程序12-14】用指针变量指向数组的一行数据示例    251
【程序12-15】一维数组作函数参数示例    253
【程序12-16】使用指向一维数组的指针变量传递参数示例    254
【程序12-17】字符串数组、字符串指针使用示例    257
【程序12-18】字符串指针作函数参数示例    258
【程序12-19】用指针数组指向二维数组每一行示例    261
【程序12-20】二维数组指针示例    262
【程序12-21】用指针数组处理字符串示例    263
【程序12-22】指针数组作函数参数示例    264
【程序12-23】指向指针的指针示例    267
【程序12-24】用二级指针操作一维数组示例    268
【程序12-25】用二级指针操作二维数组示例    270
【程序12-26】用二级指针作函数参数示例    271
【程序12-27】指针型函数示例    272
【程序12-28】指向函数的指针示例1    274
【程序12-29】指向函数的指针示例2    275
【程序12-30】指针和const的关系示例    278
【程序13-1】结构和结构变量示例    283
【程序13-2】嵌套结构成员赋值、输出示例    286
【程序13-3】初始化结构示例    289
【程序13-4】结构数组示例    291
【程序13-5】用指针处理结构数组示例    294
【程序13-6】传递结构变量的值到函数示例    295
【程序13-7】结构中嵌套联合类型示例1    298
【程序13-8】结构中嵌套联合类型示例2    299
【程序14-1】位或运算示例    308
【程序14-2】位反运算示例    308
【程序14-3】位运算用途示例    310
【程序14-4】位域示例    313
【程序14-5】二进制转换（位域与联合的使用）示例    314
【程序15-1】保存用户输入内容示例    322
【程序15-2】从文件中读取字符示例    324
【程序15-3】合并文件示例    325
【程序15-4】向文件中增加内容示例    326
【程序15-5】将文件内容显示到屏幕示例    328
【程序15-6】格式化文件数据示例    329
【程序15-7】读取格式化文件数据示例    330
【程序15-8】将整型数据写入文件示例    332
【程序15-9】从文件中读取整型数据示例    333
【程序15-10】保存二进制文件示例    334
【程序15-11】读二进制文件示例    336
【程序15-12】获取文件位置指针示例    338
【程序15-13】重置文件位置指针示例    339
【程序15-14】设置文件位置指针示例    341
【程序15-15】刷新标准输入流stdin缓冲区示例    343
【程序15-16】重定向输出到显示器示例    344
【程序15-17】重定向输出到文件示例    345
【程序15-18】重命名文件示例    346
【程序15-19】删除文件示例    347
【程序15-20】复制文件示例    348
【程序15-21】临时文件使用示例    349
【程序16-1】无参数宏示例    353
【程序16-2】操作符#示例    355
【程序16-3】操作符##示例    356
【程序16-4】条件编译示例    358
【程序16-5】条件编译嵌套示例    359
【程序16-6】使用预定宏名示例    361
【程序16-7】#line命令示例    361
【程序16-8】内联函数示例    363
【程序17-1】字符串动态存储示例    367
【程序17-2】字符检测函数示例    368
【程序17-3】字符串长度函数示例    369
【程序17-4】查找字符位置示例    370
【程序17-5】查找相同字符示例    372
【程序17-6】查找包含字符位置示例    373
【程序17-7】查找包含字符示例    374
【程序17-8】查找子串示例    375
【程序17-9】比较字符串示例    376
【程序17-10】比较部分字符串示例    378
【程序17-11】忽略大小写比较字符串示例    379
【程序17-12】连接字符串示例    381
【程序17-13】连接部分字符示例    382
【程序17-14】复制字符串示例    383
【程序17-15】复制部分字符示例    384
【程序17-16】用dup函数复制字符串示例    385
【程序17-17】大小写字符转换示例    386
【程序17-18】字符串大小写转换示例    387
【程序17-19】字符串与数值转换示例    388
【程序17-20】字符串反转示例    389
【程序17-21】替换字符示例    390
【程序17-22】分解字符串示例    391
【程序18-1】三角函数sin示例    394
【程序18-2】双三曲函数示例    395
【程序18-3】exp函数示例    396
【程序18-4】用frexp函数分解尾数和指数示例    396
【程序18-5】用ldexp函数组合实数示例    397
【程序18-6】ceil和floor函数示例    398
【程序18-7】modf函数示例    399
【程序18-8】获取日期时间示例    400
【程序18-9】转换日期时间表示形式示例    401
【程序18-10】秒数转换为对应的日期示例    402
【程序18-11】日期转换为秒数示例    403
【程序18-12】日期转换为字符串示例    404
【程序18-13】显示当前日期示例    407
【程序19-1】冒泡排序法示例    409
【程序19-2】选择排序法示例    411
【程序19-3】插入排序法示例    411
【程序19-4】Shell排序法示例    412
【程序19-5】快速排序法示例    413
【程序19-6】字符串排序示例    414
【程序19-7】顺序查找示例    416
【程序19-8】折半查找示例    418
【程序19-9】队列操作示例    419
【程序19-10】堆栈操作示例    423
【程序19-11】链表操作示例    425
【程序20-1】不同类变量分配内存空间示例    433
【程序20-2】用malloc函数动态分配内存创建动态数组示例    435
【程序20-3】用realloc函数动态分配内存示例    437
【程序20-4】用free函数释放分配内存示例    439
【程序20-5】内存分配丢失示例    440
【程序20-6】分配所有可用内存示例    441
【程序21-1】头文件，包含控制鼠标的函数原型定义    445
【程序21-2】控制鼠标的函数代码    446
【程序21-3】初始化鼠标函数代码    447
【程序21-4】复位鼠标函数代码    447
【程序21-5】移动鼠标函数代码    448
【程序21-6】显示鼠标指针函数代码    448
【程序21-7】隐藏鼠标指针函数代码    449
【程序21-8】获取按下按钮信息函数代码    450
【程序21-9】获取释放按钮信息函数代码    450
【程序21-10】获取鼠标状态信息函数代码    451
【程序21-11】获取鼠标指针位置信息函数代码    451
【程序21-12】保存鼠标指针位置函数代码    452
【程序21-13】捕获鼠标或键盘按钮函数代码    453
【程序21-14】判断鼠标指针区域代码    454
【程序21-15】测试鼠标库函数的代码    455
【程序22-1】换位加密法示例    459
【程序22-2】替换加密法示例    463
【程序22-3】位加密法示例    465
【程序23-1】LZW压缩算法头文件    474
【程序23-2】压缩函数代码    475
【程序23-3】搜索哈希表函数代码    477
【程序23-4】输出压缩数据函数代码    477
【程序23-5】解压缩函数代码    478
【程序23-6】输入编辑数据函数代码    480
【程序23-7】解压函数代码    480
【程序23-8】压缩主程序代码    481
【程序24-1】设置显示模式函数代码    486
【程序24-2】绘制点的函数代码（调用BIOS功能）    488
【程序24-3】绘制点的函数代码（直接存取显示内存）    489
【程序24-4】读取点信息的函数代码    489
【程序24-5】绘制直线的函数代码    490
【程序24-6】绘制矩形的函数代码    491
【程序24-7】绘制实心矩形的函数代码    491
【程序24-8】绘制圆的函数代码    492
【程序24-9】绘制实心圆的函数代码    493
【程序24-10】绘制多边形的函数代码    493
【程序24-11】绘制随机多边形的代码    494
【程序24-12】复制图形的函数代码    494
【程序24-13】移动图形的函数代码    495
【程序24-14】保存图形的函数代码    495
【程序24-15】载入图形的函数代码    496
【程序24-16】测试绘制函数的代码    497
【程序25-1】将C语言编译为汇编程序示例（C源程序）    500
【程序25-2】将C语言编译为汇编程序示例（汇编程序）    500
【程序25-3】简单内联汇编示例    503
【程序25-4】包含输入部分的内联汇编示例    504
【程序25-5】输出字符串的内联汇编示例    505
【程序25-6】读取寄存器值的内联汇编示例    506
【程序25-7】C语言函数调用约定示例    507
【程序25-8】add函数（C源程序）    508
【程序25-9】add函数编译后的汇编程序    508
【程序25-10】两数相乘的汇编程序示例    509
【程序25-11】C语言调用汇编程序示例    510