zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    详解以太坊世界状态
    VDF 不是工作量证明
    以太坊:Go-Ethereum: 编译运行
    【转】理解分布式账本技术: 经济学视角
    Counterfactual 项目:广义的以太坊状态通道
    Solidity 安全:已知攻击方法和常见防御模式综合列表
    Verge 攻击解析
    以太坊区块链的轻客户端
  • 原文地址:https://www.cnblogs.com/fansizhe/p/12656914.html
Copyright © 2011-2022 走看看