532628838
圣骑士
圣骑士
  • 注册日期2011-06-10
  • 发帖数98
  • QQ
  • 火币517枚
  • 粉丝77
  • 关注39
阅读:3082回复:0

delphi参数的传递

楼主#
更多 发布于:2011-08-01 17:05
  在过程或函数的调用过程中使用的变量就是参数,其作用是指明被调用时需要传递的参数个数、顺序和类型。在Object Pascal中,参数可以分为数值参数(Value)、变量参数(Variable)和常量参数(Constant)3种。默认为数值参数,数值参数总是具有确定的类型。
    一般来说,形参列表和实参列表完全匹配是指参数的个数一样,而且顺序排列的数据类型也完全一致。对于一般的函数,如果编译器发现实参的数据类型与形参的数据类型不匹配,会将实参的数据类型进行一次或多次的“提升",比如,将Integer类型转换为Double类型。
    2.数值参数
    数值参数在运行过程中只改变其形参的值,不改变其实参的值,参数的值不能传递到过程的外面。形参和实参占用不同的内存单元,在过程或函数被调用时,将实参的值复制到形参占用的内存中,相当于C语言函数调用中的传值。因此过程或函数运行结束后,形参和实参的数值是不同的,且实参的值不能发生变化。数值参数必须是一个表达式,且表达式的类型不能是文件类型或包含文件的其他结构类型,例如:
    procedure sub(i:Integer);
    1    ‘
‘Degln
    i:=i一1 0;
    end;
    ^
    var    ·
    num:Integer;
    1    ’
    Degln
    num:=20;
    sub(Bum);
    end;
    在调用过程sub(Bum)时,值参i由实参Bum得到值为20,然后i减1 O。在调用结束后Bum的值保持不变,仍为20。如果用户想改变传人的参数值,就需要使用变量参数。
    3.变量参数
    为了过程或函数中能够改变实参数值,可在过程或函数定义参数表时,在有关形参前加上保留字var。这样定义的参数称为变量参数,这时在过程或函数调用中的实际参数必须是变量的引用,相当于C语言中函数调用中的传地址。在过程或函数的执行期间,这个变量参数就代表了实际参数,改变了变量参数也就改变了实际参数。。例如:
    procedure sub(var i:Integer);
    1    ’
    t~egm
    i:=i一1 0;
    end;
    var
    num:Integer;
    1    ‘
    Degln
    num:=20;
    sub(Bum);
   end;
    在调用过程sub(Bum)时,值参i由实参nun得到值20,i和nun指向的是相同的内存单元;然后i减1 O,i的值为1 O,在调用结束后nun的值也变为1 O。
    4.常量参数
    如果当过程或函数执行时要求不改变形参的值,最好的办法就是使用常量参数。在定义形式参数表的有关参数前加上保留字const,就可以定义常量参数
  常量参数可以像局部只读变量一样使用,其初值来自过程或函数调用时的实参,实参必须是一个表达式,且表达式的类型不能是文件类型或包含文件类型的其他结构类型。
    不允许在过程或函数中给常量参数赋值,并且常量参数不能作为实参传递给另外一个过程或函数。
  5.参数默认值
  可以为过程和函数的参数指定默认数值。具体方法是在参数定义后面紧接着一个等号
“=”,然后是一个常量。指定默认数值的参数要放在参数列表的后部,将没有指定默认数值的参数放在参数列表的前面部分。在函数调用的时候,可以为设置了默认值的参数指定一个新值;
如果没有指定新值,则使用默认值。同样,如果存在多个设置了默认值的参数,只有前面的参数指定了新值,后面的参数才可以指定新值。例如:
    pocedure proc l—a  In.teger;b:Integer-1 0);
调用语句p1(a)和p1(a,1 O)是等效的。
    6.参数传递的顺序    .
    Pascal的参数传递是从左到右,而C/C++的参数传递就是从右到左,这可以通过定义过程或函数原型时用指示字来说明。在Delphi中提供了5种传递方式,如表2.7所示。
    表2.7  调用约定指示字
┏━━━━━━━┳━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━  ━━━━━━┓
┃调用约定         ┃参数传   ┃    说    明                                                                                    ┃
┃  指示字          ┃递顺序   ┃                                                                                                  ┃
┣━━━━━━━╋━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Register      ┃左到右   ┃使用寄存器来传递参数,当参数过多时才用堆栈传递                           ┃
┣━━━━━━━╋━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Pascal.      ┃左到右   ┃使用堆栈来传递参数,适合于调用动态链接库中的程序                    ┃
┣━━━━━━━╋━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃    Cdecl        ┃右到左    ┃采用C/C++调用约定,适合于调用动态链接库中用C/C++编写的程序        ┃
┣━━━━━━━╋━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Stdcall.      ┃右到左    ┃采用Windows标准调用约定来传递参数,适合于调用Windows API函数    .  ┃
┣━━━━━━━╋━━ ━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃  Safecall.    ┃右到左   ┃采用“防火墙”意外处理,可用来处理COM错误                           ┃
┗━━━━━━━┻━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

喜欢0 评分0
游客

返回顶部