函数与指针C语言.ppt

函数与指针 第7章 7 1概述 第7章 1 按功能划分模块划分模块的基本原则是 各模块都要易于理解 功能尽量单一 模块间的联系尽量少 满足这些要求的模块具有以下优点 7 1 1模块化程序结构的概念 1 模块间的接口关系简单 这种程序可读性和可理解性较强 2 需要修改某一功能时 只涉及到一个模块 不会影响到其它模块 3 脱离程序的上 下文也能单独验证一个模块的正确性 4 扩充或建立新系统时 可充分利用已有的模块 7 1概述 第7章 2 按层次组织模块结构化程序设计方法要求在设计程序时 按层次结构组织各模块 在按层次组织模块时 上层模块只需指出 做什么 最底层的模块才精确地描述 怎么做 例如 图7 1所示的层次结构中 主模块指出总任务 模块1 模块2 模块3分别指出各自的子任务 模块4 模块5 模块6才去精确描述 怎么做 7 1 1模块化程序结构的概念 图7 1按层次调用模块 7 1概述 第7章 例7 1 简单的函数调用 includemain 主函数 p1 调用p1函数 P2 调用p2函数 P1 再次调用p1函数 P1 函数p1打印一行 号 printf n P2 函数p2打印一行文字 printf WelcometoC n 7 1 2C语言程序的构成 运行结果为 WelcometoC 7 2函数的定义 第7章 1 C语言函数的概念函数就是用来完成一定的功能 所谓函数名就是给该功能起一个名字 如果该功能用来实现数学运算的 就是数学函数 在C语言中 往往把程序需要实现的一些功能分别编写为若干个函数 然后把它们组合成一个完整的程序 7 2 1C语言函数的概念及分类 7 2函数的定义 第7章 2 C语言函数的分类 1 从用户使用的角度分类 库函数 它是由编译系统提供的 用户不必定义可以直接使用的函数 用户自定义函数 用户用来实现某种功能 本章主要学习自定义函数的编写与应用 2 从函数完成的任务分类 有返回值函数 该类函数在结束时 将计算结果返回到主调函数 无返回值函数 该类函数运行结束时 没有数据返回 它只是完成某一种操作 7 2 1C语言函数的概念及分类 7 2函数的定义 第7章 3 从函数的表示形式来分类 无参函数 主调函数没有将数据传递给被调函数 一般用来完成某一操作 无参函数可以带回或不带回函数值到主调函数 有参函数 调用该类函数时 在主调函数和被调函数之间有数据传递 主调函数可以将数据传递给被调函数使用 被调函数的计算结果也可以带回主调函数使用 7 2 1C语言函数的概念及分类 7 2函数的定义 第7章 1 无参函数定义的一般形式 7 2 2函数定义的一般形式 类型函数名 说明部分 语句 7 2函数的定义 第7章 2 有参函数定义的一般形式 7 2 2函数定义的一般形式 类型函数名 类型1形参1 类型2形参2 类型n形参n 说明部分 语句部分 7 2函数的定义 第7章 3 定义空函数在程序设计中有时会用到空函数 它的形式为 7 2 2函数定义的一般形式 类型函数名 7 3函数的参数和函数的值 第7章 在调用函数时 大多数情况下 主调函数和被调函数之间有数据传递关系 这就是前面提到的有参函数 在定义函数时 函数名后面的括号中的变量称为 形式参数 简称 形参 在调用函数时 主调函数名后面括号中的参数 也可以是一个表达式 称为 实际参数 简称 实参 7 3 1形式参数和实际参数 7 3函数的参数和函数的值 第7章 通过函数调用使主调函数得到一个值 这就是函数的返回值 函数的返回值是通过return语句来获得的 其格式为 return 返回值表达式 或 return返回值表达式 功能 自定义函数运行结束 退出该函数 将 返回表达式 的值带给调用函数 7 3 2函数的返回值 7 3函数的参数和函数的值 第7章 例7 2 用函数求两个整数的最大值 程序代码 includemain 主调函数main inta b c scanf d d 退出max函数 将变量z的值8返回给主调函数main 7 3 2函数的返回值 运行结果 7 8 maxis8 7 4函数的调用 第7章 1 调用库函数调用库函数时 通常在文件开头用 include命令将调用有关库函数时所需用的信息 包含 到本文件中来 如 标准输入输出库函数用 include 数学库函数用 include 2 调用自定义函数调用自定义函数 而且该函数与调用它的函数在同一个文件中 应在主调函数中对被调函数作声明 说明函数类型 参数类型及个数 以便编译系统对函数调用进行语法检查 7 4 1函数的原型与声明 7 4函数的调用 第7章 格式 函数名 实参表列 函数调用的执行过程 先计算每个实参表达式的值 再赋值给所对应的形参中 然后执行被调用函数体 执行完函数后 返回到调用此函数的下一条语句 继续去执行主调程序中下面的语句 说明 1 如果是无参函数 则没有实参列表 但括弧不能省略 2 如果实参表列包含多个实参 则各参数间用逗号隔开 实参与形参的个数应相等 类型应一致 实参与形参是按顺序一一对应传递数据 7 4 2函数调用的一般形式 7 4函数的调用 第7章 根据函数在程序中出现的位置 大致有3种调用方式 1 函数语句把函数调用作为一个语句 如 p1 这种调用不返回函数值 只要求函数完成一定的操作 如 例7 1 2 函数表达式函数出现在一个表达式中 这时要求函数带回一个确定的值以参加表达式的运算 如 x 2 max a b 3 函数参数一个函数作为另一个函数的实参 7 4 3函数的调用方式 7 5函数的嵌套调用 第7章 C语言定义的函数都是互相独立的 函数间不能嵌套定义 嵌套定义是指定义一个函数时 其函数体内包含另一个函数的完整定义 但可以嵌套调用 也就是说在调用一个函数的过程中 该函数又调用另一函数 例如 f1和f2是分别定义的函数 但在调用函数f1的过程中又要调用函数f2 其调用过程如图7 4所示 图7 4函数嵌套调用过程 7 6函数的递归调用 第7章 在调用一个函数的过程中 又直接或间接地调用函数本身 称为函数的递归调用 语言提供两种形式的递归调用 直接递归调用 指函数直接调用函数本身的形式 其执行过程如图7 5所示 间接递归调用 指函数调用其它函数 其它函数又调用原函数的形式 其执行过程如图7 6所示 图7 5直接递归调用图7 6间接递归调用 7 6函数的递归调用 第7章 递归调用的过程可以分为两个阶段 一是从未知的向已知方向推测 二是从已知的再向未知方向回推 在有限递归的情况下 总会有一个递归的结束条件 递归函数的典型例子是求阶乘 下面通过求阶乘的函数 详细分析递归过程 阶乘的计算公式为 n n n 1 2 1递归的方法是逆推 即n 等于n n 1 而 n 1 又等于 n 1 n 2 依此类推 一直推到1 1 然后 再逆推回来即可求出结果 7 6函数的递归调用 第7章 例7 7 用递归调用 编写求n 的程序 分析 函数fact n 的函数体中出现fact n 1 这正是函数的自身调用 主函数调用该函数计算4 第一次调用时 形参n接收的值是4 进入函数体后 由于4 0 需要调用fact n 1 即fact 3 从而又开始了第二次调用该函数过程 依此类推 直到条件n 1成立 本次函数的自调过程结束 程序控制开始逐步返回 首先返回1 的结果为1 1乘n的当前值2 以其结果2返回到上次调用函数中 这样 以每次返回的值 乘以n的当前值的结果 作为本次调用的值返回到上次调用中 最后返回的是第一次调用fact 4 的值24 从而得到4 的计算结果 7 6函数的递归调用 第7章 程序代码 intfact intn 递归函数 if nmain 主函数 intn p printf n scanf d 打印返回的值 运行 n 4 显示 4 24 7 7指针与函数 第7章 7 7 2数组作为函数参数 前面介绍了用变量做函数参数 此外 数组元素也可以做函数实参 其用法与变量做函数参数相同 指针变量作为函数参数传递的是变量的地址 而数组名作实参和形参 传递的是数组的首地址 属于指针传递 1 数组元素作为函数实参数组元素作为函数的实参 与变量作实参一样 是单向传递 即 数值传送 只能将数组元素的值传递给被调函数的形参 不能带回变化的值 2 数组名作为函数参数数组名表示数组的首地址 即数组名本身就是指针 因此 用数组名作为函数参数 是把数组的首地址作为实参传递给被调用函数形参 所以是指针传递参数 7 7指针与函数 第7章 7 7 3返回指针的函数 一个函数可以返回一个int型 float型 char型的数据 也可以返回一个指针类型的数据 即地址 返回指针值的函数定义的一般形式为 其中 函数名前面的 号表明这是一个指针型函数 即函数的返回值是一个指针 类型标识符表示了返回的指针值的数据类型 类型标识符 函数名 形参列表 函数体 7 7指针与函数 第7章 7 7 4函数的指针和指向函数的指针变量 1 指向函数的指针变量的定义一个函数在编译时 系统为函数代码分配一段连续的存储空间 这段存储空间的起始地址 又称入口地址 称为这个函数的指针 函数名就是该函数所占内存区的首地址 把函数的首地址赋予一个指针变量 通过这个指针变量就可以引用该函数 指向函数的指针变量定义形式为 类型 指针变量名 这里的 类型 是指针变量所指向的函数的类型 即函数返回值的类型 7 7指针与函数 第7章 7 7 4函数的指针和指向函数的指针变量 2 用函数指针变量调用函数用函数指针变量调用函数时 只需将 指针变量名 代替函数名 在后面的括号中根据需要写上实参 使用函数指针变量还应注意以下两点 对指向函数的指针变量 不存在p p p i运算 应注意区分函数指针变量和返回指针的函数 这两者在写法和意义上的区别 3 用指向函数的指针作函数参数实现方法 函数名作为实参 指向函数的指针变量作为形参 进行函数入口地址的传递 这样 通过函数地址的传递 在被调用函数中 调用实参传递过来的其他函数 7 8变量的作用域与存储类别 第7章 7 8 1变量的作用域 所谓变量的作用域就是指变量能被有效引用的范围 从 变量的作用域 角度来分 C语言将变量分为局部变量和全局变量 1 局部变量局部变量是在函数内部定义的变量 其作用域是从定义位置起 到函数结束 说明 1 主函数main中定义的变量 只在主函数中有效 2 不同函数中可以使用相同名字的变量 因为它们在内存中被分配不同的内存单元 3 形参也是局部变量 因为形参的作用域仅限于该函数内部 4 在一个函数内部 可以在复合语句中定义变量 这些变量只在本复合语句中有效 复合语句也称为 分程序 或 程序块 7 8变量的作用域与存储类别 第7章 7 8 1变量的作用域 2 全局变量在函数之外定义的变量称为全局变量 全局变量可以被本文件中其它函数使用 它的作用范围是 从定义变量的位置开始到源文件结束 说明 1 设置全局变量的优点是 增加了函数间数据联系的渠道 由于在同一文件中所有函数都能引用全局变量的值 这样 在一个函数中改变了全局变量的值 就能影响到其他函数 相当于各函数间有直接的传递通道 由于函数调用只能返回一个值 因此 有时可以通过全局变量得到多个返回值 2 全局变量在整个程序执行过程中都占用存储单元 使用全局变量过多 会降低程序的清晰性和通用性 3 在同一源文件中 外部变量与局部变量可以同名 因为它们的作用范围内不同 所以 相互没有影响 7 8变量的作用域与存储类别 第7章 7 8 2变量的存储类别 在C语言中 每一个变量或函数都有两个属性 数据类型和存储类型 数据类型如int等 指的是数据的取值范围 存储类型指数据在内存的存储方法 存储方法分为两类 静态存储和动态存储 1 静态存储与动态存储静态存储方式 程序运行期间 变量在静态存储区分配固定的存储空间 动态存储方式 程序运行期间 变量在动态存储区根据需要动态的分配存储空间 不同的存储方式决定了变量的生存期 从变量的作用范围 又可把变量分为四种 自动Auto 寄存器register 静态static 外部extern 下面分别介绍 7 8变量的作用域与存储类别 第7章 7 8 2变量的存储类别 2 Auto型变量auto型变量是在函数内定义的变量 自动变量所在的函数或复合语句执行时 系统动态为相应的自动变量分配存储单元 函数的形参也属于auto型变量 当函数执行结束时 释放其空间 它的作用域局限于该函数 3 Register型变量register变量又称寄存器变量 在程序运行中 若某个变量使用频繁 比如循环的次数为上万次 为提高运行速度 C语言允许将局部动态变量的值 放在CPU的寄存器中 直接参加运算 不再和内存打交道 这是因为寄存器的存取速度远高于内存 7 8变量的作用域与存储类别 第7章 7 8 2变量的存储类别 4 Extern型变量extern型变量是在函数外定义的变量 缺省时系统默认为外部变量 外部变量的定义位置是在所有函数体之外 当一个变量定义为 extern 型或默认存储类型说明时 一个文件的多个函数都可以使用该外部变量 其它文件也可以使用该变量 5 static静态变量静态变量与auto Register型变量不同 该变量在静态存储区存放 所分配的存储单元在程序运行中始终占用 静态变量分为内部静态变量和外部静态变量两种 7 8变量的作用域与存储类别 第7章 7 8 2变量的存储类别 6 存储类别小结变量的存储方式分类如下 7 9内部函数和外部函数 第7章 7 9 1内部函数 如果一个函数只能被本文件中其它函数所调用 则称为内部函数 内部函数称为静态函数 使用内部函数 可以使函数只局限于所在文件 7 9内部函数和外部函数 第7章 7 9 2外部函数 在函数定义时 如果在类型的前面加上关键字extern 则表示此函数是外部函数 可供其他文件调用 如果在定义函数时省略extern 则隐含为外部函数 本书前面所用的函数都作为外部函数 通常 当函数调用语句与被调函数不在同一文件时 应当在调用语句所在函数说明部分用extern说明所调用的函数是外部函数 7 10程序举例 第7章 排序算法有多种 比较经典的有冒泡法和选择法 冒泡法在第六章中已经进行了详细的分析 下面我们用选择法来进行编程 例7 20 用选择法对10个学生的成绩由小到大排序 并计算平均成绩 排序过程及求平均值均由函数来实现 分析 所谓选择法就是先找最小值 其排序操作过程是 先将10个数中的第1个数a 0 与后面的9个数比较 若大于后面的数则进行对换 第一轮结束 a 0 中是最小值 再将a 1 与它后面的8个数进行比较 直到a 1 是剩余9个数中的最小值 每比较一轮 找出未经排序的数中最小的一个 共应比较9轮 7 10程序举例 第7章 下面以七个数为例来说明选择排序的步骤 A 0 a 1 a 2 a 3 a 4 a 5 a 6 810097112原数列 未排序时的情况 010897112将7个数中最小数0与a 0 对调 028971110将剩余6个数中的最小数2与a 1 对调027981110将剩余5个数中的最小数7与a 2 对调027891110将剩余4个数中的最小数8与a 3 对调027891110将剩余3个数中的最小数9与a 4 对调027891011将剩余2个数中的最小数10与a 5 对调 完成全部排序 7 10程序举例 第7章 程序代码 排序函数 voidsort intarray intn inti j t for i 0 iarray j 如后面的数小于前面的数 进行调换 t array i array i array j array j t 7 10程序举例 第7章 程序代码 求平均值函数 ave intarray intn inti average 0 for i 0 i n i average average array i return average 10 7 10程序举例 第7章 主函数 includemain inta 10 i t printf 请输入10个成绩 n for i 0 i 10 i 输入10个数 显示输入的个数 scanf d E mail dutpgz 网址 地址 大连市软件园路80号 大连理工大学出版社 谢谢观看

c语言指针与函数ppt,函数与指针C语言.ppt相关推荐

  1. c语言visit函数指针,C++中的函数指针总结

    1.函数指针的引出 假设我们需要写个函数 sort( start, end, compare ); 对start 和end 之间的数组元素进行排序compare 定义了比较数组中两个字符串的比较操作. ...

  2. 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )

    文章目录 一.判定指针合法性 二.数组越界 三.不断修改指针变量值 四.函数中将栈内存数组返回 五.函数间接赋值形参操作 六.指针取值与自增操作 一.判定指针合法性 判定指针合法性时 , 必须进行如下 ...

  3. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  4. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  5. C语言什么时候必须用到二级指针?(需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针)

    结论:需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针 例子:为空指针p开辟内存空间 1.不用二级指针(无法实现) #include <stdio.h> ...

  6. C语言函数指针(结构体函数指针)

    文章目录 20211126 这篇讲得好 参考文章1:C语言函数指针(指向函数的指针)详解 函数指针的定义形式: returnType (*pointerName)(param list); 示例代码: ...

  7. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

  8. 【示例】C语言中利用数组存放函数指针

    C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...

  9. C语言的指针函数与函数指针

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992050 指 ...

最新文章

  1. 11.5. blockquote
  2. 【Windows 逆向】内存地址分析 ( 内存条 | 虚拟内存 | 内存地址及寻址范围 | 内存地址与数据的关系 )
  3. sessionFactory.getCurrent()和sessionFactory.openSession()的区别
  4. 前端学习(579):chrome devtools功能简介
  5. 路由总结之静态、RIP、OSPF、IS-IS、BGP和策略路由
  6. 苹果正面临电源芯片短缺问题 可能影响iPhone 12供应
  7. 头回见!95后女大学生买iPhone11出租:租借者想尝鲜或显摆
  8. Python 机器学习 随机森林 天气最高温度预测任务(二)
  9. fatal error: highgui.h: No such file or directory
  10. MyBatis——MyBatis Generator插件使用(配置详解)
  11. 比特红:万物可直播、人人能带货
  12. JavaScript - 屏蔽鼠标右键菜单
  13. 留美学子安全手册,这个可以有
  14. matlab去除摩尔纹,索尼ILCE-7RM2测评——理论画质篇
  15. 怎样在tableau里做渐变柱状图
  16. Oauth2 数据库表说明
  17. logTracker错误日志跟踪组件(二)
  18. 小米MIUI里的便签APP是如何实现插入图片功能的?
  19. matlab:导入txt数据
  20. Linux系统基本知识(4)

热门文章

  1. python自动化:uiautomation、pyautogui操作会计记账系统(3):处理序时簿
  2. php 程序授权机制,授权认证详细说明
  3. 思科否认与华为中兴事件有关
  4. python代码——人民币转换
  5. 用c语言求解n阶线性,用C语言求解N阶线性矩阵方程Ax=b的简单解法.docx
  6. 微博爬取长津湖博文及评论
  7. 图像常见格式及转换(BGR,YUV,NV12,YUV444)
  8. 流量计损坏是由什么造成的呢
  9. 如何用you-get 下载bilibili 视频以及字幕
  10. excel里面复制粘贴整个sheet