Delphi过程函数之间的参数传递

声明过程和函数时,根据需要写入参数,参数分为两种:

形式参数:所谓形式参数是指过程和函数声明语句的参数列表中的参数,简称形参。

1 function TForm1.myfunc(s1, s2: String): String;

实际参数:实际参数则是调用函数时传入函数的参数列表,简称实参。

1 myfunc(str1,str2);

 

参数传递又分为按值传递,按址传递。-------举例理解就像数组中的 A数组:=B数组,改变任一数组内容,另外一个随之改变(同一地址)。A数组:=copy(B数组),只是内容相同,地址不同。不会随之改变

按值传递:将实参复制一份给形参所代表的临时存储单元。实参和形参的内容都保存在不同的内存地址中,在过程和函数中改变形参的值时,只是形参内容发生变化,不会影响到实参。

 1 var
 2   s1,s2: Integer;                                          S1------->> X=2
 3 begin                                                 S2------->> Y=2
 4   s1:= 2;
 5   s2:= 2;
 6   myfunc(s1,s2);
 7   ShowMessage(IntToStr(s1+s2));//结果为4,此时x,y已经改变
 8 end;
 9 
10 function TForm1.myfunc(x,y: Integer): Integer;//没有var关键字
11 begin
12   x:= x + 10;
13   y:= y + 10;
14   Result:= x + y;
15 end;

按址传递:实参将保存内容的内存地址传递给形参,形参与实参指向同一内存地址,当形参的内容发生变化时,实参的内容也会随之改变。

 1 procedure TForm1.Button1Click(Sender: TObject);
 2 var
 3   s1,s2: Integer;
 4 begin
 5   s1:= 2;
 6   s2:= 2;                                                S1------->> var @X
 7   myfunc(s1,s2);                                            S2-------->> var @Y
 8   ShowMessage(IntToStr(s1+s2));//结果为24,此时x,y已经改变
 9 end;
10 
11 function TForm1.myfunc(var x,y: Integer): Integer;//有var关键字
12 begin
13   x:= x + 10;
14   y:= y + 10;
15   Result:= x + y;
16 end;

 

参数类型:所谓的参数类型指的不是参数的数据类型,而是指在Delphi中 6 种不同的类型的参数。

即数值参数,常量参数,变量参数,无类型参数,外部参数,以及开放数组参数。

在过程或函数种形参可以分为 3 种 :

1.不带 var,称为数值参数,简称值参。 即上方 按值传递

2.带有 var,称为变量参数,简称变参。 即上方 按址传递

3.带有const,称为常量参数:

在过程或函数中,常量参数的值是不可以改变的,因此可以将它作为一个常量使用,在过程或函数中不可以为常量参数赋值,否则会出现编译错误。并且也不可以吧常量参数作为实参传递给其他过程或参数。

 

无参数数据类型:指在过程或函数声明时不指定参数的数据类型,如果参数没有指定数据类型则必须在参数前假var ,out ,count.

在参数前加 var或 out 表示参数的值是可以改变的。而参数前加 count,参数值不能改变。当参数为无类型参数时,实参可以是任意数据类型的变量或表达式。

使用无类型参数因为Delphi没有对参数进行合法检查,所以使用时应对其进行强制类型转换。好处是不用考虑实参的数据类型,只需要将形参根据实参类型强制转换即可。

1 procedure TForm1.myproc(var x, y);//参数无数据类型
2 begin
3   Integer(x):= Integer(x)+ 10;
4   Integer(y):= Integer(y)+ 10;
5 end;

外部参数:形参前使用 out 称为外部参数,它不能用来向过程函数种传入信息,只能传出。外部参数类似于变量参数。当过程或函数被调用结束后,通过外部参数可以回传某些信息,如果调用失败,外部参数就被设为空。

外部参数主要用于不允许使用函数例程的 COM 等分布式技术中,如果需要向例程传递一个没有初始化的变量也可以使用外部参数。 与上方按址传递类似。

开放数组参数:就是一个参数数组,长度是不固定的,开放数组参数可以把静态数组和动态数组传递给本身,但不能用 setlength 改变动态数组的长度。

1 type
2   arr = array[0..10] of Integer;
 1 function TForm1.arrinit(mm:arr):arr;
 2 var
 3   i: Integer;
 4 begin
 5   for i:=0 to 10do
 6   begin
 7     mm[i]:= i;
 8   end;
 9   result:= mm;
10 end;
 1 procedure TForm1.Button1Click(Sender: TObject);
 2 var
 3   aa: arr;
 4   i,sum: Integer;
 5 begin
 6   sum:= 0;
 7   aa:= arrinit(aa);
 8   for i:=0 to 10 do
 9   begin
10     sum:= sum+aa[i];
11   end;
12   ShowMessage(IntToStr(sum));
13 end;

默认参数:声明过程中可以设置参数默认值。默认参数后得其他参数也只能是默认参数,即默认参数只能出现在最后         

1 function myfunc2(x:Integer=10;y:Integer=20):Integer;
1 function TForm1.myfunc2(x, y: Integer): Integer;
2 begin
3   Result:= x + y;
4 end;
1 procedure TForm1.Button1Click(Sender: TObject);
2 var
3   sum: integer;
4 begin
5   sum:= myfunc2();     //计算自定义函数中x和y的默认值,结果40
6   sum:= myfunc2(20);   //更改了x默认值为20,结果40
7   sum:= myfunc2(20,30);//更改了x和y默认值为20,30,结果50
8 end;

 

posted @ 2020-04-07 23:03  范思哲  阅读(965)  评论(0编辑  收藏  举报