delphi参数的传递
3772 点击·0 回帖
![]() | ![]() | |
![]() | 在过程或函数的调用过程中使用的变量就是参数,其作用是指明被调用时需要传递的参数个数、顺序和类型。在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错误 ┃ ┗━━━━━━━┻━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ | |
![]() | ![]() |