C措辞进门经典(第四版)9-函数再探.doc.pdf

上传人:tbuqq 文档编号:5615839 上传时间:2020-07-02 格式:PDF 页数:4 大小:138.33KB
返回 下载 相关 举报
C措辞进门经典(第四版)9-函数再探.doc.pdf_第1页
第1页 / 共4页
C措辞进门经典(第四版)9-函数再探.doc.pdf_第2页
第2页 / 共4页
C措辞进门经典(第四版)9-函数再探.doc.pdf_第3页
第3页 / 共4页
C措辞进门经典(第四版)9-函数再探.doc.pdf_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《C措辞进门经典(第四版)9-函数再探.doc.pdf》由会员分享,可在线阅读,更多相关《C措辞进门经典(第四版)9-函数再探.doc.pdf(4页珍藏版)》请在三一文库上搜索。

1、C语言入门经典(第四版)9函数再探.txt如果不懂就说出来 , 如果懂了,就笑笑别说出来。贪 焚是最真实的贫穷,满足是最真实的财富。幽默就是一个人想哭的时候还启笑的兴致。本 文由泽五令贡献 ppt文档可能在WAP端浏览休验不佳。建议您优先选择TXT,或卜 ?载源文件到本机查看。 C入门经典(第4版)入门经典(第09章函数再探09章 学习了第8学习了第8章后,读者就应具备创建和使用函数的基础知识了. 本章将以此为基 础,介绍函数的使用和操作,尤其是如何通过指针访问函数,也会使用- 些更灵活的方法在函数 Z间通信 . C入门经典(第4版)入门经典( 9.1函数指针 指针对于操作数据和含有数据的变最

2、是一个非常有用的T具. 只要一把火钳就可处理所有火 热的东西,同样,使用指针也可以操作函数,函数的内存地址存储了函数开始执行的位置(起始 地址)地址存储了函数开始执行的位置(起始地址),存储在函数指针中的內容就是这个地址 ? 声明函数指针通过函数指针调用函数函数指针数纽. 作为变元的函数指针 C入门经典(第4版)入门经典( 9.1.1声明函数指针.1.1声明函数指针 函数指针的声明看起来有点奇怪,容易混淆,所以下而从一个简单的例子开始:int (*pfunction ) (int); C入门经典(第4版)入门经典( 9.1. 2通过函数指针调用函数 .1. 2 假定定义如下函数原型 :int

3、sum(int a, int b) ; /* Calculates a+b */这个函数有两个int类型 的参数,返回值的类型是int,所以可以把它的地址存储这个函数有两个int类 型的参数,返回值 的类型是int,所以可以把它的地址存储在如下函数指针中:int (*pfun) (int, int) = sum; C入门经典(第4版)入门经典( 9.1.3函数指针数组.1.3 函数指针和一般的变量是一样的,所以可创建函数指针的数组. 要声明函数指针数组,只需 将数纟fl的人小放在函数指针数纽名之后. 例如:int (*pfunctions10 ) (int);这条语彳】J 声 明了一 ?个包含

4、10个元素的pfunctions数组. 这个数组里的每个这条语句声明了一个包含10个 元素的pfunctions数组. 这个数组里的每个元素都能存储一个函数的地址,该函数有两个int类 型的参数,返回类型是int.元素都能存储一个函数的地址,该两数冇两个int类型 的参数,返回 类型是int. C入门经典(笫4版)入门经典( 9.1.4作为变元的函数指针.1.4 也可以将函数指针作为变元来传递,这样就可以根据指针所指向的函数,而调用不同的函 数了 ? C入门经典(第4版)入门经典(9.2函数中的变量 将程序分解成函数,不仅简化了开发程序的过程, 还增强了程序语言解决问题的能力 ?设 计 优良的

5、函数常常可以重用,使新应用程序的开发变得更快,更简单. 标准库就证明了可重用函数 的威力 . 函数屮变量的特性以及C更简单 . 标准库就证明了可重用函数的威力. 函数屮变量的特性 以及C语言在声明变量时提供的一些额外功能进一步增强了程序语言的力量. 静 态变量 : 函数内 部的追踪在函数Z间共享变量 C入门经典 ( 第4版) 入门经典( 9.2.1静态变最 : 函数内部的追踪 前面使用的所有变量在执行到定义它的块尾时就超出了作用域,它们在堆栈上分配的内存 会被释放,以供另一个函数使川?这些变量称为自动变量,因为它们是在声明时自动创建的, 在程 序退出声明它的块后自动删除. 这是一种非常高效的过

6、程,因为只要正在执行的语句在声明变量 的函数内,函数中包含数据的内存就会一直保存该数据. C入门经典 ( 第4版) 入门经典 (9.2.2在函数之间共享变最 也可以在所冇的函数Z间共享变量 . 常量在程序文件的开头声明,所以常量位于组成程序的 所有函数的外部 ) 常量位于组成程序的所有两数的外部) ,同样,也可以采用这种方式声明变量, 这种变量称为全局变量(global variables),因为它们可以在任意位置访问. 它 这 种变虽称为全局变 fi(global variables),因为它们可以在任意位置访问. 它 的声明方式和 - 般变最相同,但声明它的位 置非常重要,这个位置确定了变

7、最是否为全局变量. C入门经典 ( 第4版) 入门经典 ( 9.3调用自己的函数 : 递归 函数调用H己称为递归,递归在程序设计小不常见,所以本节仅介绍概念, 不过在某些情况 下,这是一个效率很高的技巧,町以显著简化解决特定问题所需的代码. 递归也有几个坏处 , 但这 里也不涉及 . C入门经典 ( 第4版) 入门经典 ( 9.4变元个数可变的函数 printf ()在标准库中,某些函数的变元数是可变的,例如函数printf ()和scanf ().有 在标准库 中, 某些函数的变元数是可变的,例如函数printfO和scanf ().有吋需要这么做,所以标准库提供 了编写这种函数的例程时需要

8、这么做,所以标准库捉供了编写这种函数的例程. 复制va_list复制 va_list长度可变的变元列表的基本规则 C入门经典 ( 笫4版) 入门经典 ( 9. 4. 1 复制va list 复制va list 有时需要多次处理可变的变元列表. 头文件为此定义了一个复有时需要多次处理可变的变元 列表. 头文件为此定义了一个复制已有vajist的例程 . 假定在函数中使用va_start () 创建并初始化 了一个va_list制已有va_list的例程 . 假定在函数中使用va_start()创建并 初始化了一个va_list对 象parg,现在要复制parg:对象parg,现在要复制parg:

9、 va_list pargcopy; copy(pargcopy, parg); C入门经典 ( 第4版) 入门经典 ( 9.4.2长度町变的变元列表的基本 规则 以下是编写变元数目可变的函数的基本规则:在变元数目可变的函数中,至少要有一个固 定变元 . 必须调用va_start 0初始化函数中可变变元列表指针的值. 变元指针的类必须调用 va_start()初始化函数屮可变变元列表指针的值?变元指针的类型必须声明为va_list 类型. 型必须声 明为va_list类型 . 必须有确定每个变元类型的机制. 可以假设默认的类型,或用一个参数来指定 变元的类型 ?例如,在average()函数中

10、,可以有另一个固定的变元,来指定变元的类型 ?例如, 在average()函数屮,可以有另一个固定的变元,它的值是0时,表示变元的类型是double,它的 值是1它的值是0时,表示变元的类型是double,它的值是1时, 表示变元的类型是long.如果在 va_arg()调用屮指定的变元类型不对应于调用函数吋指定的变元1。阴. 如果在眩_俞 () 调用中 指定的变元类型不対应于调用函数时指定的变元值, 两数就不能正常工作 . C入门经典 ( 第4版) 入门经典 ( 9. 5 main()函数main()函数 main ()函数是程序执行的起点 . 这个函数冇一个参数列表,在命令行中执main(

11、)函数是 程序 执行的起点 . 这个函数有一个参数列表,在命令行中执行程序时,可以给它传递变元,main()函数 可以有两个参数,也可以没有参数. 行程序时 , 可以给它传递变元 .main()函数 可以冇两个参数, 也可以没冇参数 .main。函数冇参数时,第一个参数的类型是int,表示在命令行中执行mainO函 数有参数时,第一个参数的类型是int,表示在命令行屮执行mainO函main()函数的参数个数,包 含程序名在内 . 第二个参数是一个字符串指针数组. 因此 , 如果在语句行屮,在程序名称的后面添 加两个变元,main()两数的第一因此,如果在语句行屮,在程序名称的后曲添加两个变元

12、,main() 函数的第一个变元值就是3,第二个参数是一个包含3 个变元值就是3,第二个参数是一个包含3个 指针的数组,第一个指针指向程序的名称,第二和笫三个指针是指向在命令行上输入的两个变元. C入门经典 ( 第4版) 入门经典 ( 9. 6结束程序 结束程序的方法有儿种 . 执行到mainO函数体的结尾,就等于执行mainO结束程序的方法 冇儿种 . 执行到mainO函数体的结尾,就等于执行main。中的return语句, 结束程序 . 另外, 调用 两个在头文件中声明的标准中的return语句,结束程序 ?另外,调用两个在头文件中声明的标准 库函数可以结朿程序,一个是abort ()函数

13、, 它可以立即终止程序,并表示程序库函数町以结束程 序, 一个是abort ()函数, 它可以立即终止程序,并表示程序操作是非正常结束,所以对于正常结 束的程序不应使用这个函数. C入门经典 ( 第4版) 入门经典 ( 9.7函数库 : 头文件 编译器提供了许多在头文件中声明的标准函数?头文件也称为包含文件,它们是开发应用程 序时必要的资源 ?前面已经见过一些头文件,因为头文件是C编程的一个基本组成部分? C入门经典 ( 第4版) 入门经典 ( 9. 8提高性能 冇两个工具可以使编译器生成性能更高的代码. 其中一个与矩函数调用的编译方式相关, 另 一个涉及指针的使用 ?但不能保证其效果,而是取

14、决于编译器的实现方式. 这里先探讨短两数?内 联声明函数使用restrict关键字使用restrict关键字 C入门经典 ( 第4版) 入门经典 ( 9.&1内联声明函数 C语言的功能结构要求将程序分解为许多函数,函数冇时可以非常短. 短函数的每次调用可 以用实现该函数功能的内联代码替代提高执行性能? C入门经典 ( 第4版) 入门经典 ( 9. 8. 2使用restrict关键字 使用restrict关键字 专业的C专业的C编译器可以优化对象代码的性能,这涉及到改变在代码屮为操作指定的 计算顺序 ?为了优化代码,编译器必须确保操作的这种重新排序不影响计算的结果, 并用指 针指出 这方而的错误

15、 ?为了优化涉及指针的代码,编译器必须能肯定指针是没有别名的一一换言之,每 个指针引用的数据项都没有在给必须能肯定指针是没有别名的一一换言之,每个指针引用的数据 项都没有在给定范围内以其他方式引用. 关键字restrict就可以告诉编译器,何时出现这种情定范 围内以其他方式引用 ?关键字restrict就可以告诉编译器 , 何时出现这种情况,并允许应用代码优 化功能 . C入门经典 ( 第4版) 入门经典 ( 9. 9使用restrict关键字使用restrict关键字 到此函数己经介绍完毕 , 我们的C到此函数已经介绍完毕 , 我们的C语言学习之旅也已过半, 一?些不太复杂的问题应该都可以解

16、决. 接下來的这个程序将用到目前学过的各种C的问 题应该 都对以解决 . 接卜?来的这个程序将用到冃前学过的各种C元素. 问题分析解决方案 C入门经典(第4版)入门经典( 9. 9. 1问题 现在要编写一个游戏 ?选择编写游戏程序冇几个理由?首先,现在要编写一个游戏?选择编写 游戏程序有儿个理由 ?首先,游戏比具他类型的程序复杂,即使是比较简单的游戏程序. 其次,游 戏比较有趣!的程序复杂, 即使是比较简单的游戏程序. 其次,游戏比较有趣! C入门经典(第4版)入门经典( 9. 9. 2分析 这个问题的分析和以前所见的稍有不同. 本章介绍的重点是结构化编程,换句话说,就是将 一个人问题分解成许

17、多小问题逐一解决,这就是为什么要花这么多时间介绍函数的原因? C入门经典(第4版)入门经典( 9. 9. 3解决方案 首先,建立并显示棋盘 ?为了使游戏程序比鮫短,使用比较小的棋盘(6X6).但这里在程序 屮通过一个预处理器指令将棋盘的人小设置为一个符号,(6X6).但这里在程序中通过一个预 处理器指令将棋盘的人小设置为一个符号,以便在以后改变棋盘的人小?使用一个独立的函数显 示棋盘,因为这是一个自包含的动作. C入门经典(第4版)入门经典( 9. 10小结 如果读者到目前为止都没有遇到什么大问题,说明您将成为一位有能力的C程序员 ?本 章和 前一章介绍了编写结构优秀的C程序所需的所冇知识,函程序员. 木章和前一章介绍了编写结构 优秀的C数结构是C语言的核心,要尽最使函数短小精悍,意图明确. 这是优秀C数 结构是C 语言的核心,要尽量使函数短小精悍,意图明确?这是优秀C代码的本质 . 现在读者应该能够使 用函数结构去处理口己的编程问题了 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1