参数传递与作用域.pptxVIP

  1. 1、本文档共45页,可阅读全部内容。
  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文档。上传文档
查看更多
参数传递与作用域

函数调用过程函数调用离不开栈。栈是一种数据结构,具有先进后出的特点,也就是说最先进入栈的数据总是最后从栈里出来。函数调用时,需要处理初始化和善后的工作,这些都是在栈空间里完成的。函数调用按照以下步骤进行。在栈里保存函数调用现场和函数返回地址,以便当函数调用完毕后,能返回主调函数,并且能让程序继续往下执行。在栈里给形参分配空间。计算实参表达式的值,然后将这个值拷贝给形参。执行函数体。函数体执行完毕后,通过弹栈操作释放形参所占的空间,并且得到返回地址和调用函数的现场状态,返回主调函数。【例12-1】: #include iostream using namespace std;int GetMax(int a,int b){ if(ab) return a; else return b; } void main(){ int a = 10; int b = 20; int c = GetMax(a,b); //调用函数,将实参的值拷贝给形参变量 couta“和”b“中较大的数是:” cendl;}函数调用时的内存状态如图 函数调用方式函数调用的一般形式: 函数名 (实参表)若被调用的函数的没有参数,则实参表为空。通常可以采用下面的方式来调用函数:调用函数完成一定的功能,而不需要函数返回结果。若函数调用带有返回值,则这个值将会自动丢弃。例如:DisplayMsg(How are you);GetMax(9,4); //调用GetMax函数,但并没有使用函数的返回值,这个返回值会自动丢弃2、另一种方式是调用函数,执行一定的操作,得到函数的返回值,并且把这个返回值代入表达式中参与计算。例如:int a = GetMax(9,4); int a = GetMax(9,4) + 1; cout GetMax(9,4)endl;if(GetMax(9,-4) 0) cout“最大值小于零。endl;int a=9; a=GetMax(GetMax(a,6),4); 函数(原型)声明函数如果在定义之前使用必须先进行声明,即告诉系统该函数定义将在程序的后面部分定义。函数的声明形式为: 返回类型 函数名(形参及其类型表);就算调用库函数,也必须声明。通常在本文件的开头用#include命令将调用有关库函数时所需用到的信息包含到本文件来。对函数原型的说明,通常放在程序的顶部,也可以存放到一个头文件中,然后利用#include语句嵌入到程序中。函数原型声明只写函数定义中的第1行(函数首部),并以分号结束。函数必须先定义后调用,如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。如果函数的定义在函数调用之前,可以不用函数声明函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。【例12-2:】函数声明(求一个数的n次方) #include iostreamusing namespace std; int Power (int base,unsigned int exponent); void main (void){ cout 2 ^ 8 = “ Power(2,8) \n;} int Power (int base,unsigned int exponent){ int result = 1; for (int i = 0; i exponent; ++i) { result *= base; } return result;}参数传递 在前面已经提到,函数进行参数传递,是在栈空间里为形参分配空间,并将计算各个实参的表达式的值,然后一一拷贝给形参的过程。根据函数的参数传递的不同,函数调用可以分为函数的值传递调用(传值调用)、函数的指针传递调用(传址调用)和函数的引用传递调用。 函数的值传递调用传值调用——将函数的实参表达式的值拷贝给形参。这样,实参变量和形参变量占据的是不同的存储空间,因此在函数里对形参变量的改变不会影响到实参变量的值。当函数返回时,由于对栈的操作,形参所占据的存储空间就被系统收回了,也就是说形参变量的值消失了。这样做的好处是:通过这样的方式将形参和实参隔离,使函数与函数之间的关联减到最低,有利于实现模块化的设计,同时我们也不需要为要不要在调用函数之前保存实参的值而操心。如下例:#include iostreamusing namespace std;void func(int a,int b); //函数声明void main(){ int a = 10; int b = 20; func(a,b); couta=a ,b=bendl; }void func(int a,int b){ a = 30; b = 40; couta=a ,b=bendl;

文档评论(0)

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

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

1亿VIP精品文档

相关文档