




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数一、 函数的定义1、 函数概念的引入1) 举例:计算圆面积的c程序# include void main( ) double r=5.0; double area=3.14159*r*r; printf(”圆面积为:%fn”,area);抽取计算圆面积的算法作为独立程序段,程序可改为:1. # include 2. double CalArea( ) /26行是CalArea函数功能的描述(定义)3. double r=5.0; /这个函数只能计算半径为5的圆的面积4. double area=3.14159*r*r;5. return area;6. 7. void main( )8. double area= CalArea( ); /执行CalArea函数9. printf(”圆面积为:%fn”,area);10. 修改CalArea( ) 函数,使半径的值由主函数决定 1. # include 2. double CalArea( double r ) / r为函数CalArea的形式参数3. double area=3.14159*r*r;4. return area;5. 6. void main( )7. double area= CalArea( 5 ); / 5为函数CalArea的实在参数8. printf(”圆面积为:%fn”,area);9. 修改主函数,使程序可以计算半径不同的圆的面积1. # include 2. double CalArea( double r ) / r为函数CalArea的形式参数3. double area=3.14159*r*r;4. return area;5. 6. void main( )7. double radius;8. printf(”请输入半径”);9. scanf(“%f”,&radius);10. double area= CalArea( radius ); / radius为函数的实在参数11. printf(”圆面积为:%fn”,area);12. 2) 函数的作用l 降低难度及复杂度,实行分工合作,各尽其职l 便于进行分级管理,简化程序设计3) 程序的执行总是从main()开始,最后总是在main() 结束(不论main()的位置) main( )aaa( );aaa( ) bbb( );bbb( ) 程序开始 程序结束 2、 函数的定义1) 定义格式返回类型 函数名(形参表) 函数体 double Area (double r) return 3.1415*r*r ;2) 函数参数l 含义:是函数完成功能所需要的输入信息l 参数类型:形式参数 实在参数l 组成: 形式参数:类型 参数1,类型 参数2,类型 参数n 实在参数:参数1,参数2,参数n3) 返回类型l 含义:函数运行结束返回一个结果值,该值的数据类型l 类型包括:除数组外所有数据类型(默认类型为int)4) 函数体l 含义:是函数功能的实现(描述)l 组成:语句5) 函数的类型l 无参函数/有参函数 无参函数类型 函数名() 函数体 有参函数类型 函数名(形参表) 函数体 l 无返回值/有返回值 无返回值void 函数名(形参表) return ;或 void 函数名(形参表) 有返回值返回值类型 函数名(形参表) return 表达式;3、 空函数1) 含义:函数体为空的函数2) 意义:增加程序的可读性,便于程序的扩充4、 return 语句1) 格式:return 表达式 ;表达式为可选项2) 作用:l 终止当前函数的执行,返回主调函数l 向主调函数返回一个值5、 函数原型1) 前提:所有标识符都必须遵循“先说明,后使用”的原则。2) 结论:因此在函数的调用前,必须有函数的说明。3) 函数原型与函数定义的区别l 函数定义定义性说明“从无到有”提供函数的所有信息l 函数原型参考性说明“提供函数调用所需的接口信息”l 定义只能有一次,但声明可以多次出现4) 函数原型语句的格式:返回类型 函数名(形参表);5) 函数能正确调用的条件:函数的定义位于调用之前 或 函数的原型位于调用之前6) 必须使用函数原型的情况l 多文件程序l 函数递归调用l 使用库函数二、 函数调用1、 函数的调用1) 调用格式: 函数名(实参表);实参 出现在 主调函数中 形参 出现在 被调函数中 2) 注意:l 实参与形参的个数要相同,类型要一致(兼容),且一一对应l 常量形参(const):函数体中不能改变该形参的值。3) 调用方式:作为表达式(必须是有返回值的函数)/ 作为语句调用2、 调用过程1) 参数传递2) 执行函数体3) 函数返回3、 参数传递机制(赋值)1) 传值调用 形式 对应关系赋值实参 表达式(有确定值) 值形参 变量(存储单元) 变量2) 传地址调用 形式 对应关系赋值实参 变量的地址 地址形参 变量 指针 l 数组名作为实参传递的是数组的首地址。三、 程序运行时的内存分布l 程序运行时的内存分布 程序代码区全局数据区堆 区栈 区 程序的源代码(系统支配的空间) 全局变量和静态变量(系统支配的空间) 由程序控制,可在运行中由语句动态分配(malloc)及回收(free) 被调用的函数信息,局部变量 (程序支配的空间) 注:红色为数据区,在全局数据区的数据,若没初始化,自动取值为0; 堆、栈区的数据,若没初始化,其值为随机值。四、 函数调用的实现机制1、 函数调用时系统执行的操作:l 建立被调用函数的栈空间l 保护断点(主调函数的运行状态、返回地址)l 参数传递l 被调用函数取得程序的控制权2、 函数执行结束后系统执行的操作:l 若有返回值,将它存到一个临时的空间l 恢复断点(主调函数的运行状态、返回地址)l 释放相应(调用函数所占)的栈空间l 继续执行主调函数五、 作用域1、 作用域:标识符在程序中起作用(能被使用)的范围l 全局作用域: 始于声明点,终于程序(程序中一般都含有多个.cpp)的结束。l 文件作用域(static):始于声明点,终于本文件(.cpp)结束处l 局部(块)作用域:始于声明点,终于“块”结束处2、 存储属性:1) 静态:全局变量、static变量2) 动态:堆变量、自动变量、函数的形参、寄存器变量3、 变量的作用域1) 全局变量:在函数之外定义l 无限制:可供程序中的所有函数使用l 有限制:文件域变量-只供本文件中的所有函数使用2) 局部变量:在复合语句内定义,仅能在该复合语句内使用3) 覆盖问题:l 内层的同名变量总是覆盖外层的同名变量l 作用域小覆盖作用域大的4) 归纳全局变量局部变量无限制限制:文件域在函数外定义在函数内定义非静态存储类型(不带static)静态存储类型(带static)非静态存储类型(不带static)静态存储类型(带static)其他文件用extern加以声明后可以使用不让其他文件使用离开定义它的函数后其值不保留(释放内存单元)离开定义它的函数后其值仍保留(保留内存单元)初值为0初值为随机值初值为04、 生命期(生存期):标识符存在(创建到删除之间)的时间。l 静态生命期: 全局变量、静态变量 、常量特点:编译时分配空间,程序运行结束才释放空间l 动态生命期:非静态的局部变量栈区中的变量特点:在函数调用时分配存储单元,函数结束就释放空间l 动态生命期:使用malloc()等函数分配空间的变量特点:程序运行中随时根据需要申请分配空间、释放空间(free)5、 举例:例1:# include stdio.hvoid fun(int ,int );void main() int a,b; /这个a,b是内部(局部)变量,有效范围(作用域)在此处开始到main结束() a=5;b=8; fun(a,b); printf(主函数中:a=%d,b=%dn,a,b);void fun(int a,int b) /这个a,b是内部(局部)变量,有效范围(作用域)在此处开始到fun结束() int c; /c是内部(局部)变量,有效范围(作用域)在此处开始到fun结束() c=a;a=b;b=c; printf(fun函数中:a=%d,b=%dn,a,b);fun也可写成:void fun(int x,int y) /这个x,y是局部变量,有效范围(作用域)在此处开始到fun结束() int c; /c是局部变量,有效范围(作用域)在此处开始到fun结束() c=x;x=y;y=c; printf(fun函数中:a=%d,b=%dn,x,y);例2:test6_8_2.c:# include stdio.hvoid fun( );int a,b; /这个a,b是外部(全局)变量,有效范围(作用域)在此处开始到test6_8_2.c文件的最后一行void main() a=5;b=8; fun(); printf(主函数中:a=%d,b=%dn,a,b);void fun() int c; /c是内部(局部)变量,有效范围(作用域)在此处开始到fun结束() c=a;a=b;b=c; printf(fun函数中:a=%d,b=%dn,a,b);例3:程序1:a.c# include stdio.hvoid fun( );int a,b; /这个a,b是外部(全局)变量,有效范围(作用域)在此处开始到程序结束void main() a=5;b=8; fun(); printf(主函数中:a=%d,b=%dn,a,b);程序2:b.cextern int a,b; /两个函数不在同一个程序中,要使用其他程序中定义的外部(全局)变量,需要做出声明void fun() int c; /c是内部(局部)变量,有效范围(作用域)在此处开始到fun结束() c=a;a=b;b=c; printf(fun函数中:a=%d,b=%dn,a,b);例4:程序1:a.c# include stdio.hvoid fun( );static int a,b; /这个a,b是静态外部(全局)变量,有效范围(作用域)限制在a.c中void main() a=5;b=8; fun(); printf(主函数中:a=%d,b=%dn,a,b);fun(); printf(主函数中:a=%d,b=%dn,a,b);程序2:b.cextern int a,b; /虽然做出声明,但无法使用a.c中定义的静态外部变量void fun() int c; /c是内部(局部)变量,有效范围(作用域)在此处开始到fun结束() c=a;a=b;b=c; printf(fun函数中:a=%d,b=%dn,a,b);例5:# include stdio.hint a,b; /这个a,b是外部(全局)变量,初始值为0,它们的作用范围是整个程序void fun( );void main() int a,b; /这个a,b是内部(局部)变量,初始值为随机值 b=8; /当外部变量和内部变量作用范围重合时,内部起作用 fun(); printf(主函数中:a=%d,b=%dn,a,b); /在 main范围中,局部变量a,b起作用void fun() a+; b-; printf(fun函数中:a=%d,b=%dn,a,b);例6:# include stdio.hvoid fun( );void main() int i; for (i=1;i1)# include double factorial(int );void main() int x; printf(求n!,请输入n值:); scanf(“%d”, &x); printf(%d !=%f n, x , factorial(x)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业仓储管理流程优化方案
- 抗疫志愿者采访问题集与答复示范
- 医疗机构消毒隔离规范培训题库
- 财务分析报告(案例版)
- 某地高考数学解题技巧详解
- 桥梁张拉施工技术难点攻关方案
- 中学英语听力训练课件大全
- 高二化学知识点强化与试题解析
- 中小学初中英语核心词汇教学计划
- 数学教案设计与教学目标结合实践
- 双人合作开店协议书范本
- 质量员模拟题含答案
- 以史为帆明方向+少年立志向未来+课件-2025-2026学年上学期主题班会
- 2025上海科技馆事业单位工作人员招聘10人笔试备考题库及答案解析
- 摩擦力影响因素实验报告范本
- 钢结构工程施工安全管理方案
- 医疗机构员工服务规范手册
- 基坑防护课件
- 2025年黑龙江省龙东地区中考英语真题含答案
- 医疗器械生产质量管理规范2025版
- 2025年医护人员法律法规知识考试题库及答案(一)
评论
0/150
提交评论