- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
;01.函数的概念;本章重点难点;模块化程序设计思想:
为了降低开发大规模软件的复杂度,往往需将大规模的问题分解为若干个小问题,小问题再分解为更小的问题。
模块:一个具有独立功能的程序段。
函数是C语言中模块化程序设计的最小单位;;1.函数的分类;函数在使用之前必须定义。
函数定义的基本格式为:
返回值类型函数名(类型1形式参数1,类型2形式参数2,…) /*函数头部*/
{/*花括号{}之间为函数体,花括号为函数体的定界符*/
说明部分;/*对函数体内所有变量和即将要调用的函数作声明*/
语句部分;/*可执行语句序列*/
}
函数可以分为:有参函数,无参函数。
C语言不允许函数的嵌套定义。;;1.函数调用和实参;2.函数调用和返回值;2)有返回值函数的调用
若函数中有“return(表达式);”语句或“return表达式;”语句,则该函数一定有返回值。
return后面表达式值的类型应以所在函数返回值类型为准。
当函数类型为int时,可以不写,系统默认为int。;3.函数调用时的数据传递;1)单向值传递方式
单向值传递方式是调用函数时,将实参值计算出来赋给对应的形参,即数据只能从实参单向传给形参。
单向值传递的调用过程
①形参和实参各占一个独立的存储空间。
②形参的存储空间是在函数调用时才分配的,调用前是不占存储的。调用开始,系统为形参开辟一个临时存储区,然后将各实参值传给对应的形参,这时形参就得到了实参的值。
③函数执行完返回时,形参的临时存储区被回收。
单向值传递调用的特点
①函数中对形参的操作不会影响到主调函数中的实参。
②单向值传递时实参可以是常数、已有值的变量和表达式,而形参一般是变量。
;2)地址传递方式
在函数调用中,把实参数组的起始地址传给形参,这样两个数组就共占同一段内存空间(形参数组是不分配内存的)。
传递了数组的首地址后,被调函数就能够准确的知道该数组的存储位置。
形参数组中各元素值如发生变化会使这个实参数组的值同时发生变化。
也称为双向传递,即不仅能将主调函数中的数据带到被调函数,而且能把被调函数变化了的数据带回主??函数。
注意:
①以一维数组名作参数时,实参数组必须定义为具有确定长度的数组,而形参可以不定义长度。
②使用形参数组时,其下标不要超过实参数组的长度。
③实参数组与相应的形参数组类型应一致。
;;1.局部变量;2.全局变量;3.变量的生存期;1)用auto声明的自动变量
变量定义时缺少存储类型说明则系统默认为自动变量。
例如:
autointa=2,b=3;
等价于:
inta=2,b=3;
特点:函数调用结束,该种变量即被释放,属于动态存储方式。;2)用register声明的寄存器变量
寄存器是CPU内部的一种容量有限但速度极快的存储器。
寄存器的存取速度高于内存的存取速度。
现代编译程序能自动优化程序,自动把普通变量优化为寄存器变量,并且可以忽略用户的register指定,所以一般无需特别声明变量为寄存器变量。;3)用extern声明的外部变量
如果在所有函数之外定义的变量没有指定其存储类别,那么它就是一个外部变量。外部变量是全局变量。
没有显示初始化的外部变量由编译程序自动初始化为0。;4)用static声明的静态变量
这种变量的值在函数结束后占用的存储空间不回收,在下一次调用该函数时,变量的值仍保持上一次退出函数前所拥有的值。
优点:提高了程序的运行效率。
缺点:对于相同的输入参数输出不同的结果,因此建议尽量少用静态局部变。
C语言规定在定义局部静态变量时,如不赋初值,自动赋初值,数值型变量则赋0值,字符型变量赋空字符。;;函数是可以嵌套调用的,如下图所示,main可以调用函数A,函数A继续调用函数B。;求n的阶乘n!
;longfactn(4)
{
longfac;
......
fac=4*factn(3);
returnfac;
}
;longfactn(4)
{
longfac;
......
fac=4*factn(3);
returnfac;
}
;longfactn(4)
{
longfac;
......
fac=4*factn(3);
returnfac;
}
;递归优点:思路简洁清晰(因为具体的实施过程不需要编程者思考)
递归缺点:效率有时比循环低(因为函数调用需要代价消耗)
;;?;#includestdio.h
floatf11(floatx)
{
doubley;
y=2.0*
文档评论(0)