i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

形参与实参

Posted on 2016-12-12 13:36  shnoip  阅读(998)  评论(0编辑  收藏  举报
过程或函数首部中形式参数表中的参数是形式参数(简称形参),形式参数表对子程序(过程或函数)直接引用的变量进行说明,详细定义了形式参数的个数和每个参数的数据类型。子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求。
 
子程序调用(过程或函数调用)的执行顺序有以下几步:
1、实参与形参结合,用形式参数去代替实在参数
2、执行子程序体
3、返回调用处继续执行(形参及局部量消失)
 
形参不仅有不同的数据类型,而且有值参数和变量参数等不同种类。
 
值参数的作用是用以接收数据,常被称为子程式的入口参数。这类参数在形参表中,只需要说明其数据类型就可以了。
 
变量参数多用于过程,变量参数的作用是向调用程序传送结果,因此常被称为出口参数。这类参数在形参表中需要在其前面以保留字VAR来说明,并以有无VAR来区分变量参数和值参数。
 
与变量形参对应的实参必须是变量,不能是常量或表达式;和值形参对应的实参可以是变量、常量或表达式。实在值参数的类型必须和形式值参数的类型赋值相容,而实在变量参数的类型必须和形式变量参数的类型完全一致。
 
一、值形参
值形参是指形式参数表中前面没有保留字var的这一类参数。
如:
procedure s(a,b:integer);
其中,a和b为值形参。
传值就是把实在参数的值“赋给”对应的形式参数,而实在参数本身并不参与过程体的执行。
实参和值形参之间数据传递是单向的,只能由实参传递给值形参,相当于赋值运算。
当值形参是实型变量名时,对应的实参可以是整型表达式(即赋值相容)。
当子程序运行完毕返回主程序后,值形参的存储单元被释放,因此值形参又称“输入参数”或“入口参数”。
 
例1:写出下面程序运行结果。
var
  m:integer;
procedure add(b:integer);
begin
  writeln('b=',b);
  b:=b+100;
  writeln('b=',b);
end;
begin
  m:=5;
  writeln('m=',m);
  add(m);
  writeln('m=',m);
end.
 
运行结果见本页末。
 
二、变量形参
变量形参是指形式参数表中前面带保留字var的参数。
如:
procedure sum(var s:real);
如果过程的形式参数表中引用的是变量形参,那么在调用过程时,就将对应的实参的存储地址传给这个形参,称为“传地址”。所以过程体内对形参的任何操作,实际上就是对相应的实参的操作。
与变量形参对应的实参只能是变量名,而不能是表达式。根据程序需要,实参可以先赋值,也可不赋值。
变量形参与对应实参的类型必须完全相同。
由于对变量形参的操作其实就是对实参的操作,在过程中对形参的一切操作都将反映到实参上,过程执行完毕后,实参将这些操作的结果带回主程序。所以,变量参数又称为“输出参数”或“出口参数”。
 
例2:写出下面程序运行结果。
var
  m:integer;
procedure add(var b:integer);
begin
  writeln('b=',b);
  b:=b+100;
  writeln('b=',b);
end;
begin
  m:=5;
  writeln('m=',m);
  add(m);
  writeln('m=',m);
end.
 
运行结果见本页末,你做对了吗?
 
选用形式参数时,到底是使用值形参还是变量形参,应慎重考虑。一般在函数中尽量使用值形参;而在过程中,如果需要过程向调用程序返回值时,应采用变量形参。
 
例3:写出下面程序运行结果。
var
  i,j:integer;
procedure sample(x:integer;var y:integer);
begin
  x:=x+2;y:=y+2;
end;
begin
  i:=0;j:=0;
  sample(i,j);
  writeln(i,j);
end.
 
例1运行结果:
m=5
b=5
b=105
m=5
 
例2运行结果:
m=5
b=5
b=105
m=105
 
例3运行结果:
02