




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章函数
数值比较6.1函数的参数6.2函数嵌套与递归6.3C语言的库函数6.6main函数的参数6.5变量的作用域与存储类型6.46.1数值比较6.1.1函数的定义1.函数定义函数定义通常由两部分组成:函数首部与函数体。
函数的一般定义如下:类型函数名(形参列表)/*函数首部*/{ 变量声明 /*函数体*/语句}2.定义函数的注意事项
函数定义不能嵌套,函数定义应该在所有函数之外。可以在主调用函数之前,也可以在主调用函数之后。6.1.2函数的声明1.标准库函数的声明如被调用函数为C语言系统提供的标准库函数,可在程序的开头部分用#include进行文件包含,在前面案例中所见过的printf()、sqrt()等函数,就属于这种形式。printf()函数包含于stdio.h文件,sqrt()函数包含于math.h文件,则在使用这两个函数之前,应在程序开头部分用下面的语句进行包含。#include"stdio.h"#include"math.h"2.自定义函数的声明
如果是用户自定义函数,如函数与主调函数在同一程序文件中,在调用前用如下语句进行声明:类型函数名(实参列表);
函数声明按其位置不同,作用范围也不同。(1)在所有函数外部进行声明(2)在函数内部进行声明在某一函数内声明的函数,则仅可在声明它的函数内部被调用。6.1.3函数的调用1.在单行语句中调用2.在表达式中调用3.作为参数调用6.1.4函数的返回
函数返回时,可以使用关键字return返回,也可以等函数执行到结尾的花括号时,自动返回主调函数。当函数需要有返回值时,就可以用关键字return返回。函数返回值类型要求与函数类型一致。如果函数无返回值,则须将函数类型定义为void(无值型)。
返回语句中的表达式可以是有具体值的变量、常量或常量表达式。如果函数使用了“return表达式”形式返回数据,则表达式的数据类型应与函数类型一致,实际上,函数的数据类型也就是函数返回值的数据类型。
可以看到,对于int型的函数,其返回值也是int型。除了返回单个变量的值以外,还可以返回一个表达式的计算结果,但要求表达式的计算结果与函数类型相同。
返回语句可用在需要返回的任一位置,也可以有多个返回语句,但只有一个在返回时被执行。函数在定义时也可以没有返回语句,这时程序执行到结尾的花括号时自动返回主调函数。
函数可以没有参数或返回值,这种函数通常是实现某一结果可预期的功能,如打印、报警等。6.2函数的参数6.2.1函数参数概述函数之间的通信通常是由参数的传递来完成的。函数定义时的参数称为形参,函数调用时的参数称为实参。6.2.2赋值调用
赋值调用时,函数将实参的值复制一份,传递给形参,从而实现参数的传递,在程序运行过程中,形参的变化不会影响实参。需要注意的是,形参只在定义它的函数中存在,当从函数返回时,将释放形参所占的存储空间。6.2.3传址调用
传址调用时,函数将把实参的地址传递给形参,通过对地址的内容进行访问,可以在被调函数中对该地址内容进行调用和修改。由于实参和形参都指向同一存储空间,因此这种改变将引起实参的内容改变。6.2.4数组参数与字符串参数1.数组参数的传递在对于数组为参数的函数进行设计时,通常需要传递给函数的多个参数。对于一维数组来说,一个参数是按地址传递的数组名(即数组首地址),另一个参数则是数组的长度大小。在程序设计中,像排序、查找这样的算法时常会使用。
用数组名作为函数参数时还应注意以下几点。①形参数组和实参数组的类型必须一致,否则将引起错误。②形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。③在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。④多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。2.字符串参数的传递
字符串的处理也是程序设计中的常见内容,由于字符串本身都是使用数组或指针进行存储的,因此,字符串也能像数组一样依靠指针进行传递。与数组不同的是,字符串一般都不需要说明其长度,因为字符串都有一个特殊的符号’\0’来表示字符串的结束。6.3函数嵌套与递归6.3.1函数嵌套在函数调用中,允许在函数中调用另一个已声明的函数,这种在一个函数中调用另一个函数的用法称为函数的嵌套。6.3.2函数递归1.递归调用如果在函数的函数体内,又定义了语句来调用函数自身,这种调用称为直接递归调用。如果函数a()中有语句调用函数b(),而函数b()中又有语句调用了函数a(),这种调用称为函数的间接递归调用。2.函数递归的条件
一个有意义的递归算法应该满足以下条件。(1)可以将要解决的问题分解为一个新的问题,而这个新问题是原问题的一个子问题,即新问题的解法仍与原问题相同,只是原问题的处理对象有规律地变化。(2)这种转化过程可以使问题得到解决。(3)必须有一个确定的结束条件,在满足条件时返回。3.递归算法与循环算法6.4变量的作用域与存储类型6.4.1变量的作用域变量的作用域是指变量的作用范围,在这个范围内,变量是有效存在的。变量在退出这个范围时,将释放为其分配的存储空间,如果在范围之外,对该变量的引用将会发生错误。按作用域的不同,变量分为全局变量和局部变量。1.局部变量
在函数内部定义的变量称为局部变量,它只在定义它的作用域内有效,当退出作用域时,其存储空间被释放。前面案例中所定义过的变量都是局部变量。
局部变量在进入作用域空间时定义并分配存储空间,在退出作用域空间时自动释放。在不同函数内部可以定义有相同名称的变量,但这些变量代表不同的对象,仅对于定义它们的函数有效。2.全局变量
全局变量是定义在所有函数之外的变量,可以为本程序中的所有函数所共享。全局变量从变量的定义开始,到程序文件结束,变量一直有效。在一个函数内对变量所作的改变,将影响其他函数中该变量的值。但需要注意的是,如果定义了与全局变量同名的局部变量,则局部变量优先。6.4.2变量的存储类型1.静态变量静态变量通常是在变量定义时,就分配存储单元,并且一直占用该存储单元,,直至整个程序结束。静态变量定义格式如下:static数据类型变量名;2.动态变量
动态变量又称为自动变量,在程序执行过程中,需要使用它时才分配存储单元,使用完毕立即释放。例如函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时为其分配存储空间。动态变量的定义格式如下:auto数据类型变量名;/*关键字auto可缺省*/3.寄存器变量
通常,变量的值都是存储在内存中的,有些变量由于要大量重复调用(例如,for循环中的循环变量),为了提高执行效率,C语言允许将变量的值存放到CPU的寄存器中,这种变量就称为寄存器变量。寄存器变量定义格式如下:register数据类型变量名;4.外部变量
外部变量是在函数外部定义的变量,也就是前面学过的全局变量。6.5main函数的参数6.5.1main()函数的参数
main()函数也可以有参数,并且它的参数有特殊的用途。
C语言中规定,main()函数可以有三个参数,分别是argc、argv和env,带参数的main()函数格式如下:main(intargc,char*argv[],char*env[]){
…}
当将C可语言源程序编译为可执行文件,在以命令行形式执行该可执行文件时,将把三个参数argc、argv和env传递到程序中。三个参数的含义如下。①argc为整数,它的内容是程序执行时传递给main()函数的命令行参数的个数。②argv为字符串数组。argv[0]为程序运行时的完整路径和文件名(仅对于DOS3.X以上版本的操作系统),arg[1]为执行程序时程序名后的第一个字符串,arg[2]为执行程序时程序名后的第二个字符串…argv[argc]的值为NULL。③env为字符串数组。env的每一个元素都包含了形如“ENVVAR=value”形式的字符串,其中,ENVVER对应程序运行平台的环境变量,如DOS的PATH、提示符格式等。6.6C语言的库函数6.6.1C语言函数库1.标准输入/输出函数标准输入/输出函数在程序中用于数据的输入/输出,标准输入/输出函数的原型在头文件stdio.h中声明。2.字符处理函数与字符串处理函数
字符处理函数和字符串处理函数主要用于对字符和字符串的操作,由于C语言中没有字符串数据类型,因此对字符串的操作都是依靠字符串处理函数来完成的。3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教辽宁 九年级 下册 语文 期末专题训练《 专题七 文言文对比阅读》课件
- 网络信息安全技术课件 第10章 网络扫描技术
- 软件产品交付流程
- 重点环节应急管理制度和预案
- 连锁药店店长年终总结及计划
- 人教版一年级上册数学第二单元《位置》试卷2
- 个人收汇佣金合同范例
- 仓库货物承揽合同范例
- 加油站拍卖合同范例
- 加工承揽简易合同范例
- 《骑鹅旅行记》-完整版课件
- 场地清理检验批质量验收及记录
- 钢轨超声波探伤PPT
- GB 18581-2020 木器涂料中有害物质限量
- 磁共振1.5T和3.0T的差异课件
- Revit基础入门课件(PPT 126页)
- 《海水养殖池塘尾水处理技术规范》标准及编制说明
- CAMDS操作手册
- 中考初中英语必考单词1000个配图速记大全
- 监控施工规范
- 护士长管理培训知识
评论
0/150
提交评论