过程或函数首部中形式参数表中的参数是形式参数(简称形参),形式参数表对子程序(过程或函数)直接引用的变量进行说明,详细定义了形式参数的个数和每个参数的数据类型。子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求。
子程序调用(过程或函数调用)的执行顺序有以下几步:
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