C语言函数的调用与参数(13、14、15).docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如果一个函数要使用参数,它就必须定义接受参数值的变量。 4.3.1 形式参数与实际参数 函数定义时填入的参数我们称之为形式参数,简称形参,它们同函数内部的局部变量作用相同。形参的定义是在函数名之后和函数开始的花括号之前。 调用时填入的参数,我们称之为实际参数,简称实参。 必须确认所定义的形参与调用函数的实际参数类型一致,同时还要保证在调用时形参与实参的个数出现的次序也要一一对应。如果不一致,将产生意料不到的结果。与许多其它高级语言不同,(是健壮的,它总要做一些甚至你不希望的事情,几乎没有运行时错误检查,完 全没有范围检测。作为程序员,必须小心行事以保证不发生错误,安全运行。 4.3.2 赋值调用与引用调用 一般说来,有两种方法可以把参数传递给函数。第一种叫做“赋值调用”(call by value),这种方法是把参数的值复制到函数的形式参数中。这样,函数中的形式参数的任何变化不会影响到调用时所使用的变量。 把参数传递给函数的第二种方法是“引用调用”(call by reference)。这种方法是把参数的地址复制给形式参数,在函数中,这个地址用来访问调用中所使用的实际参数。这意味着,形式参数的变化会影响调用时所使用的那个变量(详细内容请参见后续章节)。 除少数情况外,C语言使用赋值调用来传递参数。这意味着,一般不能改变调用时所用变量的值。请看例4 - 9。 在这个例子里,传递给函数sqr( )的参数值是复制给形式参数x的,当赋值语句x = x * x执行时,仅修改局部变量x。用于调用sqr ( )的变量t,仍然保持着值10。 执行程序: RUN enter 100 10 切记,传给函数的只是参数值的复制品。所有发生在函数内部的变化均无法影响调用时使用的变量。 ? C语言函数可以自我调用。如果函数内部一个语句调用了函数自己,则称这个函数是“递归”。递归是以自身定义的过程。也可称为“循环定义”。 递归的例子很多。例如定义整数的递归方法是用数字1,2,3,4,5,6,7,8,9加上或减去一个整数。例如,数字15是7+8;数字21是9+12;数字12是9+3。 一种可递归的计算机语言,它的函数能够自己调用自己。一个简单的例子就是计算整数阶乘的函数factor()数N的阶乘是1到N之间所有数字的乘积。例如3的阶乘是1×2×3,即是6。 factor()和其等效函数fact()如例4-10所示。 非递归函数fact()的执行应该是易于理解的。它应用一个从1开始到指定数值结束的循环。 在循环中,用“变化”的乘积依次去乘每个数。 factor()的递归执行比fact()稍复杂。当用参数1调用factor()时,函数返回1;除此之外的其它值调用将返回factor(n-1)*n这个乘积。为了求出这个表达式的值,用(n-1)调用factor()一直到n等于1,调用开始返回。 计算2的阶乘时对factor()的首次调用引起了以参数1对factor()的第二次调用。这次调用返回1,然后被2乘(n的初始值),答案是2(把printf()语句插入到factor()中,察看各级调用及其中间答案,是很有趣的)。 当函数调用自己时,在栈中为新的局部变量和参数分配内存,函数的代码用这些变量和参数重新运行。递归调用并不是把函数代码重新复制一遍,仅仅参数是新的。当每次递归调用返回时,老的局部变量和参数就从栈中消除,从函数内此次函数调用点重新启动运行。可递归的函数被说成是对自身的“推入和拉出”。 大部分递归例程没有明显地减少代码规模和节省内存空间。另外,大部分例程的递归形式比非递归形式运行速度要慢一些。这是因为附加的函数调用增加了时间开销(在许多情况下,速度的差别不太明显)。对函数的多次递归调用可能造成堆栈的溢出。不过溢出的可能性不大,因为函数的参数和局部变量是存放在堆栈中的。每次新的调用就会产生一些变量的复制品。这个堆栈冲掉其它数据和程序的存储区域的可能性是存在的。但是除非递归程序运行失控,否则不必为上述情况担心。 递归函数的主要优点是可以把算法写的比使用非递归函数时更清晰更简洁,而且某些问题,特别是与人工智能有关的问题,更适宜用递归方法。递归的另一个优点是,递归函数不会受到怀疑,较非递归函数而言,某些人更相信递归函数。编写递归函数时,必须在函数的某些地方使用if语句,强迫函数在未执行递归调用前返回。如果不这样做,在调用函数后,它永远不会返回。在递归函数中不使用if语句,是一个很常见的错误。在开发过程中广泛使用printf()和getchar()可以看到执行过程,并且可以在发现错误后停止运行。 ? 在编写C语言的函数时,有几个要点需要我们牢记,因为它们影响到函数的效率和可用性。 4.5.1 参数和通用函数 通用函数是指能够被用在各种情况下,或者是可被许多不同程

文档评论(0)

hong333666 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档