- 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)