形式参数:值形式参数、变量形式参数。函数或过程定义时的参数为形式参数。
实在参数:函数或过程调用时的参数为实在参数。
1、值形式参数
值形参的作用:值形参从与它位置对应的实参中接受数据并把数据传送到所在的过程或函数中。
当过程或函数被调用时,系统为每个值形参开辟临时的存储单元,并按从左到右的顺序,把实在参数的值一一赋给对应位置上的形式参数。
应该强调的是:
①形参表中只能使用类型标识符,而不能使用类型。
②值形参和对应的实参必须一一对应,包括个数和类型。
③实参和值形参之间数据传递是单向的,只能由实参传送给形参,相当赋值运算。
④一个特殊情况是,当值形参是实型变量名时,对应的实参可以是整型表达式。
⑤值形参作为子程序的局部量,当控制(执行到)返回程序后,值形参的存储单元释放。
2、变量形式参数
必须在形参名的前面加上 VAR 。
变量形参的作用:变量形参可以将子程序调用过程中产生的值返回调用它的程序,这时会有两种可能:
⑴实参已有确定值,变量形参从对应实参中接收数据,把经过子程序的处理后的值返回主程序,从而改变实参的值。
⑵在调用过程或函数前,实参没有确定的值,与它对应的变量形参可以把在过程或函数执行过程中所得的值传回,使这个实参得到确定的值。
当过程或函数被调用时,系统并不为变量形参另辟存储单元,而是让它们和对应的实参共用存储单元。
应该注意的是:
①与变量形参对应的实参只能是变量名,而不能是表达式。
②与变量形参对应的实参可以根据需要决定是否事先有值。
③变量形参与对应的实参的类型必须完全相同。
④对变量形参,运行时不另外开辟存储单元,而是与对应的实参使用相同的存储单元。也就是说,调用子程序时,是将实参的地址传送给对应的变量形参。
⑤当控制返回到调用程序后,变量形参的存储单元不释放,但变量形参本身无定义,即不得再使用。
选用形式参时,到底是使用值形参还是变量形参,应慎重考虑。值形参需要另开辟存储空间,而变量形参会带来一些副作用。一般在函数中使用值形参,而在过程中才使用变量形参,但也有例外。
3、值形参数和变量形式参数的区别
⑴在过程或函数调用时,值形参数所对应的实参必须有确定的值;而变量形参所对应的实参的值是否确定并不会影响调用的进行。
⑵在过程或函数被调用后,值形参数所对应的实参的值保持不变;而变量形参所对应的实参的值会发生改变。
4、例子
例1写出下列两个程序的运行结果。
program ex1; program ex2;
var a,b:integer; var a,b:integer;
procedure swap(x,y:integer); procedure swap(Var x,y:integer) ;
var t:integer; var t:integer;
begin begin
t:=x;x:=y;y:=t; t:=x;x:=y;y:=t;
end; end;
begin begin
a:=1;b:=2; a:=1;b:=2;
writeln(a:3,b:3); writeln(a:3,b:3);
swap(a,b); swap(a,b);
writeln(a:3,b:3); writeln(a:3,b:3);
end. end.
分析:这两个程序唯一的区别是ex1中将x,y作为值形参,而 ex2中将x,y作为变量形参,因此在ex2中对x,y的修改实际上是对调用该过程时与它们对应的变量a,b的修改,故最后,a,b的值为2,1。而ex1中调用swap过程时,只是将a,b的值传递给x,y,之后在过程中的操作与a,b无关。
答:ex1的运行结果为: ex2的运行结果为:
1 2 1 2
1 2 2 1
例2写出下列程序的运行结果。
program ffd;
var x,y,z,t:integer;
procedure p(a,b:integer;var c,d:integer);
begin
a:=a+1;
b:=b+1;
c:=c+1;
d:=d+1;
writeln(a:5,b:5,c:5,d:5);
end;
begin
x:=1;
y:=2;
z:=3;
t:=4;
p(x,y,z,t);
writeln(x:8,y:8);
writeln(z:8,t:8);
writeln
end.
答:程序的运行结果为:
2 3 4 5
1 2
4 5