The C Programming Language
文章平均质量分 75
M菜鸟M
这个作者很懒,什么都没留下…
展开
-
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.7 实例(存储分配程序)
目录、参考文献我们在第 5 章给出了一个功能有限的面向栈的存储分配程序本节将要编写的版本没有限制,可以以任意次序调用 和 在必要时调用操作系统以获取更多的存储空间这些程序说明了通过一种与系统无关的方式编写与系统有关的代码时应考虑的问题,同时也展示了结构、联合和 的实际应用 并不是从一个在编译时就确定的固定大小的数组中分配存储空间,而是在需要时向操作系统申请空间因为程序中的某些地方可能不通过 调用申请空间(也就是说,通过其它方式申请空间),所以, 管理的空间不一定是连续的这样,空闲存储空间以原创 2022-06-12 14:48:06 · 166 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.6 实例(目录列表)
目录、参考文献我们常常还需要对文件系统执行另一种操作,以获得文件的有关信息,而不是读取文件的具体内容目录列表程序便是其中的一个例子,比如 UNIX 命令 ,它打印一个目录中的文件名以及其它一些可选信息,如文件长度、访问权限等等MS-DOS 操作系统中的 命令也有类似的功能由于 UNIX 中的目录就是一种文件,因此, 只需要读此文件就可获得所有的文件名但是,如果需要获取文件的其它信息,比如长度等,就需要使用系统调用在其它一些系统中,甚至获取文件名也需要使用系统调用,例如在 MS-DOS 系统中即如此原创 2022-06-12 14:45:35 · 225 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.5 实例(fopen 和 getc 函数的实现)
目录、参考文献下面以标准库函数 和 的一种实现方法为例来说明如何将这些系统调用结合起来使用标准库中的文件不是通过文件描述符描述的,而是使用文件指针描述的文件指针是一个指向包含文件各种信息的结构的指针,该结构包含下列内容:描述文件的数据结构包含在头文件 中任何需要使用标准输入/输出库中函数的程序都必须在源文件中包含这个头文件(通过 指令包含头文件)此文件也被库中的其它函数包含在下面这段典型的 代码段中,只供标准库中其它函数所使用的名字以下划线开始,因此一般不会与用户程序中的名字冲突所有的标原创 2022-06-12 14:43:27 · 96 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.4 随机访问(lseek)
目录、参考文献输入/输出通常是顺序进行的:每次调用 和 进行读写的位置紧跟在前一次操作的位置之后但是,有时候需要以任意顺序访问文件,系统调用 可以在文件中任意移动位置而不实际读写任何数据:将文件描述符为 的文件的当前位置设置为 ,其中, 是相对于 指定的位置而言的随后进行的读写操作将从此位置开始, 的值可以为 、 或 ,分别用于指定 从文件开始、从当前位置或从文件结束处开始算起例如,为了向一个文件的尾部添加内容(在 UNIX shell 程序中使用重定向符 或在系统调用 中使用参数原创 2022-06-11 01:29:27 · 89 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.3 open、creat、close、unlink
目录、参考文献除了默认的标准输入、标准输出和标准错误文件外,其它文件都必须在读或写之前显式地打开系统调用 和 用于实现该功能 与第 7 章讨论的 相似不同的是,前者返回一个文件描述符,它仅仅只是一个 类型的数值,而后者返回一个文件指针如果发生错误, 将返回 与 一样,参数 是一个包含文件名的字符串第二个参数 是一个 类型的值,它说明以何种方式打开文件,主要的几个值如下所示:在 System V UNIX 系统中,这些常量在头文件 中定义而在 Berkeley(BSD) 版本中原创 2022-06-11 01:28:21 · 99 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.2 低级 I/O(read 和 write)
目录、参考文献输入与输出是通过 和 系统调用实现的在 C 语言程序中,可以通过函数 和 访问这两个系统调用这两个函数中,第一个参数是文件描述符,第二个参数是程序中存放读或写的数据的字符数组,第三个参数是要传输的字节数每个调用返回实际传输的字节数在读文件时,函数的返回值可能会小于请求的字节数如果返回值为 ,则表示已到达文件的结尾,如果返回值为 ,则表示发生了某种错误在写文件时,返回值是实际写入的字节数如果返回值与请求写入的字节数不相等,则说明发生了错误在一次调用中,读出或写入的数据的字节原创 2022-06-11 01:27:00 · 84 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.1 文件描述符
目录、参考文献UNIX 操作系统通过一系列的系统调用提供服务这些系统调用实际上是操作系统内的函数,它们可以被用户程序调用本章将介绍如何在 C 语言程序中使用一些重要的系统调用如果读者使用的是 UNIX,本章将会对你有直接的帮助这是因为,我们经常需要借助于系统调用以获得最高的效率,或者访问标准库中没有的某些功能但是,即使读者是在其它操作系统上使用 C 语言,本章的例子也将会帮助你对 C 语言程序设计有更深入的了解不同系统中的代码具有相似性,只是一些细节上有区别而已因为 ANSI C 标准函数库是原创 2022-06-11 01:25:22 · 78 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.8 其它函数
参考文献:The C Programming Language目录标准库提供了很多功能各异的函数,本节将对其中特别有用的函数做一个简要的概述更详细的信息以及其它许多没有介绍的函数请参见附录 B前面已经提到过字符串函数 、、 和 都在头文件 中定义在下面的各个函数中, 与 为 类型, 与 为 类型头文件 中定义了一些用于字符测试和转换的函数在下面各个函数中, 是一个可表示为 类型或 的 对象该函数的返回值类型为 标准库提供了一个称为 的函数,它与第 4 章中编写的函数 相比功能原创 2022-06-05 23:41:14 · 122 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.7 行输入和行输出
参考文献:The C Programming Language目录标准库提供了一个输入函数 ,它和前面几章中用到的函数 类似 函数从 指向的文件中读取下一个输入行(包括换行符)并将它存放在字符数组 中,它最多可读取 个字符读取的行将以 结尾保存到数组中通常情况下, 返回 ,但如果遇到了文件结尾或发生了错误,则返回 我们编写的 函数返回行的长度,这个值更有用,当它为 时意味着已经到达了文件的结尾输出函数 将一个字符串(不需要包含换行符)写入到一个文件中:如果发生错误,该函数将返回原创 2022-06-05 21:46:12 · 89 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.6 错误处理(stderr 和 exit)
参考文献:The C Programming Language目录 程序的错误处理功能并不完善如果因为某种原因而造成其中的一个文件无法访问,相应的诊断信息要在该连接的输出的末尾才能打印出来当输出到屏幕时,这种处理方法尚可以接受,但如果输出到一个文件或通过管道输出到另一个程序时,就无法接受了为了更好地处理这种情况,另一个输出流以与 和 相同的方式分派给程序,即 即使对标准输出进行了重定向,写到 中的输出通常也会显示在屏幕上下面我们改写 程序,将其出错信息写到标准错误文件上该程序通过两种方式发出原创 2022-06-05 20:49:02 · 109 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.5 文件访问
参考文献:The C Programming Language目录到目前为止,我们讨论的例子都是从标准输入读取数据,并向标准输出输出数据标准输入和标准输出是操作系统自动提供给程序访问的接下来,我们编写一个访问文件的程序,且它所访问的文件还没有连接到该程序程序 可以用来说明该问题,它把一批命名文件串联后输出到标准输出上 可用来在屏幕上打印文件,对于那些无法通过名字访问文件的程序来说,它还可以用作通用的输入收集器例如下列命令行:将在标准输出上打印文件 和 的内容如何设计命名文件的读取过程呢?即如原创 2022-06-05 20:47:27 · 97 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.4 格式化输入(scanf 函数)
参考文献:The C Programming Language目录输入函数 对应于输出函数 ,它在与后者相反的方向上提供同样的转换功能具有变长参数表的函数 的声明形式如下: 函数从标准输入中读取字符序列,按照 中的格式说明对字符序列进行解释,并把结果保存到其余的参数中格式参数 定义解析的规则,其它所有参数都必须是指针,用于指定经格式转换后的相应输入保存的位置在命令行中运行时,C 程序在调用 函数时,如果标准输入中没有未读的值,则程序会阻塞,控制传递给命令行程序命令行中输入非换行符的字符时,原创 2022-06-05 20:46:02 · 104 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.3 变长参数表
参考文献:The C Programming Language目录本节以实现函数 的一个最简单版本为例,介绍如何以可移植的方式编写可处理变长参数表的函数因为我们的重点在于参数的处理,所以,函数 只处理格式字符串和参数,格式转换则通过调用函数 实现函数 的声明形式为 其中,省略号表示参数表中参数的数量和类型是可变的,省略号只能出现在参数表的尾部因为 函数不需要像 函数一样返回实际输出的字符数,因此将它声明为 编写函数 的关键在于如何处理一个甚至连名字都没有的参数表标准头文件 中包含一组宏原创 2022-06-05 20:45:08 · 77 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.2 格式化输出(printf 函数)
参考文献:The C Programming Language目录输出函数 将内部数值转换为字符的形式下面只讲述该函数最典型的用法,附录 B 中给出了该函数完整的描述函数 在输出格式 的控制下,将其参数进行转换与格式化,并在标准输出设备上打印出来它的返回值为打印的字符数格式字符串包含两种类型的对象:普通字符、转换说明在输出时,普通字符将被复制到输出流中,而转换说明并不直接输出到输出流中,而是用于控制 中参数的转换和打印每个转换说明都由一个百分号字符 开始,并以一个转换字符结束在字符 和原创 2022-06-05 20:43:47 · 150 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.1 标准输入/输出
参考文献:The C Programming Language目录输入/输出功能并不是 C 语言本身的组成部分,所以到目前为止,我们并没有过多地强调但是,程序与环境之间的交互比我们在前面部分中描述的情况要复杂很多本章将讲述标准库,介绍一些输入/输出函数、字符串处理函数、存储管理函数与数学函数,以及其它一些 C 语言程序的功能本章讨论的重点将放在输入/输出上ANSI 标准精确地定义了这些库函数,所以,在任何可以使用 C 语言的系统中都有这些函数的兼容形式如果程序的系统交互部分仅仅使用了标准库提供的功能原创 2022-06-04 15:36:38 · 148 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.9 位字段
参考文献:The C Programming Language目录在存储空间很宝贵的情况下,有可能需要将多个对象保存在一个机器字中一种常用的方法是,使用类似于编译器符号表的单个二进制位标志集合外部强加的数据格式(如硬件设备接口)也经常需要从字的部分值中读取数据考虑编译器中符号表操作的有关细节程序中的每个标识符都有与之相关的特定信息例如,它是否为关键字,它是否是外部的且(或)是静态的,等等对这些信息进行编码的最简洁的方法就是使用一个 或 对象中的位标志集合通常采用的方法是,定义一个与相关位的位置原创 2022-06-04 15:34:47 · 97 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.8 联合
参考文献:The C Programming Language目录联合是可以(在不同时刻)保存不同类型和长度的对象的变量,编译器负责跟踪对象的长度和对齐要求联合提供了一种方式,以在单块存储区中管理不同类型的数据,而不需要在程序中嵌入任何同机器有关的信息它类似于 Pascal 语言中的变体记录我们来看一个例子(可以在编译器的符号表管理程序中找到该例子)假设一个常量可能是 、 或字符指针特定类型的常量值必须保存在合适类型的变量中然而,如果该常量的不同类型占据相同大小的存储空间,且保存在同一个地方的话,原创 2022-06-04 15:33:16 · 186 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.7 类型定义(typedef)
参考文献:The C Programming Language目录C 语言提供了一个称为 typedef 的功能,它用来建立新的数据类型名例如,声明 将 定义为与 具有同等意义的名字类型 可用于类型声明、类型转换等,它和类型 完全相同:类似地,声明 将 定义为与 或字符指针同义此后,便可以在类型声明和类型转换中使用 ,如: 在语法上类似于 、 等,这里以大写字母作为 定义的类型名的首字母,以示区别这里举一个更复杂的例子,用 定义本章前面介绍的树节点:上述类型定义创建了两个新类原创 2022-06-04 15:31:30 · 82 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.6 表查找
参考文献:The C Programming Language目录为了对结构的更多方面进行深入的讨论,我们来编写一个表查找程序包的核心部分代码这段代码很典型,可以在宏处理器或编译器的符号表管理例程中找到例如,考虑 语句,当遇到类似于 之类的程序行时,就需要把名字 和替换文本 存入到某个表中此后,当名字 出现在某些语句中时,如: 就必须用 来替换 以下两个函数用来处理名字和替换文本 函数将名字 和替换文本 记录到某个表中,其中 和 仅仅是字符串 函数在表中查找 ,若找到,则返回指原创 2022-06-04 15:30:04 · 93 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.5 自引用结构
参考文献:The C Programming Language目录假定我们需要处理一个更一般化的问题:统计输入中所有单词的出现次数因为预先不知道出现的单词列表,所以无法方便地排序,并使用折半查找也不能分别对输入中的每个单词都执行一次线性查找,看它在前面是否已经出现,这样做,程序的执行将花费太长的时间更准确地说,程序的执行时间是与输入单词数目的二次方成比例的一种解决方法是,在读取输入中任意单词的同时,就将它放置到正确的位置,从而始终保证所有单词是按顺序排列的虽然这可以不用通过在线性数组中移动单词来实现原创 2022-06-04 15:26:05 · 108 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.4 指向结构的指针
参考文献:The C Programming Language目录为了进一步说明指向结构的指针和结构数组,我们重新编写关键字统计程序,这次采用指针,而不使用数组下标 的外部声明不需要修改,但 和 函数必须修改:这里需要注意几点首先, 函数在声明中必须表明:它返回的值类型是一个指向 类型的指针,而非整型这在函数原型及 函数中都要声明如果 找到与输入单词匹配的数组元素,它将返回一个指向该元素的指针,否则返回 其次, 的元素在这里是通过指针访问的,这就需要对 做较大的修改 和 的初值分别是指原创 2022-06-04 15:23:14 · 69 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.3 结构数组
参考文献:The C Programming Language目录考虑编写这样一个程序,它用来统计输入中各个 C 语言关键字出现的次数我们需要用一个字符串数组存放关键字名,一个整型数组存放相应关键字的出现次数一种实现方法是,使用两个独立的数组 和 分别存放它们,如下所示我们注意到,这两个数组的大小相同,考虑到该特点,可以采用另一种不同的组织方式也就是我们这里所说的结构数组,每个关键字项包括一对变量:这样的多个变量对构成一个数组,我们来看下面的声明:它声明了一个结构类型 ,并定义了该类型的结构原创 2022-06-04 15:21:15 · 95 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.2 结构与函数
参考文献:The C Programming Language目录结构的合法操作只有几种:作为一个整体复制和赋值,通过 运算符取地址,访问其成员其中,复制和赋值包括向函数传递参数以及从函数返回值结构之间不可以进行比较可以用一个常量成员值列表初始化结构,自动结构也可以通过赋值进行初始化为了更进一步地理解结构,我们编写几个对点和矩形进行操作的函数至少可以通过 3 种可能的方法传递结构:一是分别传递各个结构成员,二是传递整个结构,三是传递指向结构的指针这 3 种方法各有利弊 函数带有两个整型参数,并返原创 2022-06-04 15:19:21 · 106 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 6 结构 / 6.1 结构的基本知识
参考文献:The C Programming Language目录结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下某些语言将结构称为 “ 记录 ”,比如 Pascal 语言由于结构将一组相关的变量看作一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中工资记录是用来描述结构的一个传统例子每个雇员由一组属性描述,如姓名、地址、社会保险号、工资等其中的某些属性也可以是结构,例如姓名可以分成几部分,地址甚至工资也可能出现类似的情原创 2022-06-04 15:14:31 · 100 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.12 复杂声明
参考文献:The C Programming Language目录C 语言常常因为声明的语法问题而受到人们的批评,特别是涉及到函数指针的语法C 语言的语法力图使声明和使用相一致对于简单的情况,C 语言的做法是很有效的,但是,如果情况比较复杂,则容易让人混淆原因在于,C 语言的声明不能从左至右阅读,而且使用了太多的圆括号我们来看下面所示的两个声明:以及它们之间的含义差别说明: 是一个前缀运算符,其优先级低于 ,所以,声明中必须使用圆括号以保正确的结合顺序尽管实际中很少用到过于复杂的声明,但是,懂原创 2022-06-02 22:55:56 · 168 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.11 指向函数的指针
参考文献:The C Programming Language目录在 C 语言中,函数本身不是变量,但可以定义指向函数的指针这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等为了说明指向函数的指针的用法,我们接下来将修改本章前面的排序函数在给定可选参数 的情况下,该函数将按数值大小而非字典顺序对输入行进行排序排序程序通常包括 3 部分:由于排序算法与比较、交换操作无关因此,通过在排序算法中调用不同的比较和交换函数,便可以实现按照不同的标准排序这就是我们的新版本排序函数所采原创 2022-06-02 22:53:07 · 106 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.10 命令行参数
参考文献:The C Programming Language目录在支持 C 语言的环境中,可以在程序开始执行时将命令行参数传递给程序调用主函数 时,它带有两个参数第一个参数(习惯上称为 ,用于参数计数)的值表示运行程序时命令行中参数的数目第二个参数(称为 ,用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数我们通常用多级指针处理这些字符串最简单的例子是程序 ,它将命令行参数回显在屏幕上的一行中其中命令行中各参数之间用空格隔开命令 将打印 按照 C 语言的约定, 的值是启动原创 2022-06-02 22:51:41 · 128 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.9 指针与多维数组
参考文献:The C Programming Language目录对于 C 语言的初学者来说,很容易混淆二维数组与指针数组之间的区别,比如上面例子中的 假如有下面两个定义:那么,从语法角度讲, 和 都是对一个 对象的合法引用但 是一个真正的二维数组,它分配了 个 类型长度的存储空间并且通过常规的矩阵下标计算公式 (其中, 表示行, 表示列)计算得到元素 的位置但是,对 来说,该定义仅仅分配了 个指针,并且没有对它们初始化它们的初始化必须以显式的方式进行,比如静态初始化或通过代码初原创 2022-06-02 22:49:23 · 153 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.8 指针数组的初始化
参考文献:The C Programming Language目录考虑这样一个问题:编写一个函数 ,它返回一个指向第 个月名字的字符串的指针这是内部 类型数组的一种理想的应用 函数中包含一个私有的字符串数组,当它被调用时,返回一个指向正确元素的指针本节将说明如何初始化该名字数组指针数组的初始化语法和前面所讲的其它类型对象的初始化语法类似:其中, 的声明与排序例子中 的声明相同,是一个一维数组,数组的元素为字符指针 数组的初始化通过一个字符串列表实现,列表中的每个字符串赋值给数组相应位置的元素原创 2022-06-02 22:46:04 · 87 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.7 多维数组
参考文献:The C Programming Language目录C 语言提供了类似于矩阵的多维数组,但实际上它们并不像指针数组使用得那样广泛我们考虑一个日期转换的问题,把某月某日这种日期表示形式转换为某年中第几天的表示形式,反之亦然例如,3 月 1 日是非闰年的第 60 天,是闰年的第 61 天在这里,我们定义下列两个函数以进行日期转换:函数 将某月某日的日期表示形式转换为某一年中第几天的表示形式,函数 则执行相反的转换因为后一个函数要返回两个值,所以在函数 中,月和日这两个参数使用指针的形原创 2022-06-02 22:44:52 · 89 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.6 指针数组以及指向指针的指针
参考文献:The C Programming Language目录由于指针本身也是变量,所以它们也可以像其它变量一样存储在数组中下面通过编写 UNIX 程序 的一个简化版本说明这一点该程序按字母顺序对由文本行组成的集合进行排序我们在第 3 章中曾描述过一个用于对整型数组中的元素进行排序的 排序函数,并在第 4 章中用快速排序算法对它进行了改进这些排序算法在此仍然是有效的,但是,现在处理的是长度不一的文本行并且与整数不同的是,它们不能在单个运算中完成比较或移动操作我们需要一个能够高效、方便地处理原创 2022-06-02 22:43:39 · 80 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.5 字符指针与函数
参考文献:The C Programming Language目录字符串常量是一个字符数组,例如 在字符串的内部表示中,字符数组以空字符 结尾,所以程序可以通过检查空字符找到字符数组的结尾字符串常量占据的存储单元数也因此比双引号内的字符数大 1字符串常量最常见的用法也许是作为函数参数,如 当类似于这样的一个字符串出现在程序中时,实际上是通过字符指针访问该字符串的在上述语句中, 接受的是一个指向字符数组第一个字符的指针也就是说,字符串常量可通过一个指向其第一个元素的指针访问除了作为函数参数外,字符原创 2022-06-02 22:40:35 · 78 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.4 地址算术运算
参考文献:The C Programming Language目录如果 是一个指向数组中某个元素的指针,那么 将对 进行自增运算并指向下一个元素而 将对 进行加 的增量运算,使其指向指针 当前所指向的元素之后的第 个元素这类运算是指针或地址算术运算中最简单的形式C 语言中的地址算术运算方法是一致且有规律的,将指针、数组和地址的算术运算集成在一起是该语言的一大优点为了说明这一点,我们来看一个不完善的存储分配程序,它由两个函数组成第一个函数 返回一个指向 个连续字符存储单元的指针,原创 2022-06-02 22:37:35 · 204 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.3 指针与数组
参考文献:The C Programming Language目录在 C 语言中,指针和数组之间的关系十分密切,因此,在接下来的部分中,我们将同时讨论指针与数组通过数组下标所能完成的任何操作都可以通过指针来实现一般来说,用指针编写的程序比用数组下标编写的程序执行速度快但另一方面,用指针实现的程序理解起来稍微困难一些声明 定义了一个长度为 10 的数组 换句话说,它定义了一个由 10 个对象组成的集合,这 10 个对象存储在相邻的内存区域中名字分别为 、 … (参见图 5-3)。 表示该数组的第原创 2022-06-02 22:34:57 · 106 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.2 指针与函数参数
参考文献:The C Programming Language目录由于 C 语言是以传值的方式将参数值传递给被调用函数的因此,被调用函数不能直接修改主调函数中变量的值例如,排序函数可能会使用一个名为 的函数来交换两个次序颠倒的元素但是,如果将 函数定义为下列形式:则 无法达到该目的由于参数传递采用传值方式,因此上述的 函数不会影响到调用它的例程中的参数 和 的值该函数仅仅交换了 和 的副本的值为了实现目标,可以使主调程序将指向所要交换的变量的指针传递给被调用函数:由于一元运算符原创 2022-05-31 23:28:54 · 75 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 5 指针与数组 / 5.1 指针与地址
参考文献:The C Programming Language目录指针是一种保存变量地址的变量在 C 语言中,指针的使用非常广泛,原因之一是,指针常常是表达某个计算的惟一途径另一个原因是,同其它方法比较起来,使用指针通常可以生成更高效、更紧凑的代码指针与数组之间的关系十分密切指针和 语句一样,会导致程序难以理解,如果使用者粗心,指针很容易就指向了错误的地方但是,如果谨慎地使用指针,便可以利用它写出简单、清晰的程序ANSI C 的一个最重要的变化是,它明确地制定了操纵指针的规则事实上,这些规则已经原创 2022-05-31 23:26:05 · 107 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 4 函数与程序结构 / 4.11 C 预处理器
参考文献:The C Programming Language目录C 语言通过预处理器提供了一些语言功能从概念上讲,预处理器是编译过程中单独执行的第一个步骤两个最常用的预处理器指令是:本节还将介绍预处理器的其它一些特性,如条件编译与带参数的宏文件包含指令(即 指令)使得处理大量的 指令以及声明更加方便在源文件中,任何形如: 或 的行都将被替换为由文件名指定的文件的内容如果文件名用引号引起来,则在源文件所在位置查找该文件如果在该位置没有找到文件,或者如果文件名是用尖括号 括起来的,则将...原创 2022-05-31 23:22:47 · 79 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 4 函数与程序结构 / 4.10 递归
参考文献:The C Programming Language目录C 语言中的函数可以递归调用,即函数可以直接或间接调用自身我们考虑一下将一个数作为字符串打印的情况前面讲过,数字是以反序生成的:低位数字先于高位数字生成,但它们必须以与此相反的次序打印解决该问题有两种方法一种方法是将生成的各个数字依次存储到一个数组中,然后再以相反的次序打印它们,这种方式与 3.6 节中 函数的处理方式相似另一种方法则是使用递归,函数 首先调用它自身打印前面的(高位)数字,然后再打印后面的数字这里编写的函数不能处原创 2022-05-31 23:20:23 · 194 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 4 函数与程序结构 / 4.9 初始化
参考文献:The C Programming Language目录前面我们多次提到过初始化的概念,不过始终没有详细讨论本节将对前面讨论的各种存储类的初始化规则做一个总结在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为 0而自动变量和寄存器变量的初值则没有定义(即初值为无用的信息)定义标量变量时,可以在变量名后紧跟一个等号和一个表达式来初始化变量:对于外部变量与静态变量来说,初始化表达式必须是常量表达式,且只初始化一次从概念上讲是在程序开始执行前进行初始化对于自动变量与寄存器变量,则在每原创 2022-05-31 23:18:30 · 74 阅读 · 0 评论 -
The C Programming Language(第 2 版) 笔记 / 4 函数与程序结构 / 4.8 程序块结构
目录C 语言并不是 Pascal 等语言意义上的程序块结构的语言,它不允许在函数中定义函数但是,在函数中可以以程序块结构的形式定义变量变量的声明(包括初始化)除了可以紧跟在函数开始的花括号之后,还可以紧跟在任何其它标识复合语句开始的左花括号之后以这种方式声明的变量可以隐藏程序块外与之同名的变量,它们之间没有任何关系,并在与左花括号匹配的右花括号出现之前一直存在例如,在下面的程序段中:变量 的作用域是 语句的 “ 真 ” 分支,这个 与该程序块外声明的 无关每次进入程序块时,在程序块内声明原创 2022-05-31 22:47:31 · 75 阅读 · 0 评论