ch5_2函数的参数传递-C++精编.pptVIP

  • 2
  • 0
  • 约 51页
  • 2016-08-05 发布于湖北
  • 举报
5.3 函数的参数传递 参数是调用者给出去的,被调用进接来过使用的数据。那么这个“给”和“接”的传递过程是怎样实现的呢? 函数调用的过程: 参数传递 形式参数和实际参数 在定义函数时函数名后面的括弧中的变量名称为形式参数,简称“形参” ---被动接收,形如傀儡 在主调函数中调用一个函数时,函数名后面括弧中的参数称为实际参数,简称“实参”----主动施舍,占据主导 补充概念 Notice: 实参与形参的个数、位置与类型必须一致。 C++语言规定实参可以是变量、常量或者表达式。 函数定义中的形参只有当发生函数调用时,才被分配内存单元。 int max(int x, int y ); void main( ) { int x=3,y=4,result; result=max(x+10,y+20); coutresult; } int max(int x, int y ) { int z; if(xy) z=x; else z=y; return z; } 用单步运行的方式(F10或F11)调试如下代码: 调试中几个需要注意的细节: Variables窗口: 这个窗口始终跟踪当前上下文中重要的变量取值。但不能增加对变量的跟踪。 形参的值在即将开始执行被调函数max的定义体前就已经确定下来. context: (n. 上下文,环境,背景) 在variables窗口的上部,还有一个context的组合框,可以用来切换当前查看的上下文。 函数max的context随着函数max被调用而建立,而当max调用返回后被销毁。 函数max的context中的变量x\y与main中的变量x\y同名但不是同一东东。 从这里我们可以看出, C++在发生函数调用时: 首先就会为被调函数建立起不同于主调函数的一个空间。 依据实参值建立形参,然后开始执行其函数体。 在函数调用结束后,这个空间会被操作系统回收。 这就是函数运行时的栈空间!!! 应用程序运行时内存布局 事实上。。。 函数运行时的栈空间中除了保存相应的数据外, 还要保存主调函数的发生函数调用时的地址(返回地址)和操作系统状态(现场) 函数调用时,C++需要做的事情: 建立被调函数的栈空间,栈空间的大小由函数定义体中的数据量多少决定; 保存主调函数的运行状态和返回地址; 传递参数; 将控制权转交给被调函数; 函数运行完成后,复制返回值到函数数据块底部; 恢复调用函数的运行状态; 返回到调用函数; 5.3.2 传值方式 void func(Type a); // Type为任意数据类型 void main( ) { Type x; func ( x ); } 传值时形参是对实参的克隆:在被调函数栈空间中创建了形参,并用实参来初始化它。 void func (int a); //func函数声明 void main() { int a=0; func(a); // func函数调用 coutaendl; } void func (int a) //func函数定义 { a=10; } 输出:0 Go 传值方式:向函数传递参数时,先复制一份参数,然后才将复制品传给参数。这样,被调函数中所有对参数的操作,就只是在使用复制品。形参的改变不会影响实参的值——单向传递 int a=0; …… //调用 func(a); …… void func (int a) //函数func定义 { a=10; } 将参数a复制一份 再将复制品a传给函数 结果这里的a是复制品 传值参数传递过程演示 void swap(int a, int b) { int temp; temp=a;a=b;b=temp; } void main() { int x,y; cinxy; swap(x,y); cout“x=x y=yendl; } 【例1】分析下面程序,能否交换两个变量的值? 5.3.2 传址参数1 ----指针参数 void func (int * pa); //func函数声明 void main() { int a=0; func(a); // func函数调用 coutaendl; } void func (int *pa) //func函数定义 { *pa=10; } 输出:10 Go 指针值的真正用途是进行数据间访,以达到操作不属于本函数栈区内数

文档评论(0)

1亿VIP精品文档

相关文档