引用参数(出错在哪里?)新手问题
引用“Delphi精要” 引用参数
Pascal 例程的传递参数可以是值参也可以是引用参数。值参传递是缺省的参数传递方式:即将值参的拷贝压入栈中,例程使用、操纵的是栈中的拷贝值,不是原始值。
当通过引用传递参数时,没有按正常方式把参数值的拷贝压栈(避免拷贝值压栈一般能加快程序执行速度),而是直接引用参数原始值,例程中的代码也同样访问原始值,这样就能在过程或函数中改变参数的值。引用参数用关键字var 标示。
参数引用技术在大多数编程语言中都有,C语言中虽没有,但C++中引入了该技术。在C++中,用符号 &表示引用;在VB中,没有ByVal 标示的参数都为引用。
下面是利用引用传递参数的例子,引用参数用var关键字标示:
procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;
在这种情况下,参数既把一个值传递给过程,又把新值返回给调用过程的代码。当你执行完以下代码时:
var
X: Integer;
begin
X := 10;
DoubleTheValue (X);
x变量的值变成了20,因为过程通过引用访问了X的原始存储单元,由此改变了X的初始值。
通过引用传递参数对有序类型、传统字符串类型及大型记录类型才有意义。实际上Delphi总是通过值来传递对象,因为Delphi对象本身就是引用。因此通过引用传递对象就没什么意义(除了极特殊的情况),因为这样相当于传递一个引用到另一个引用。
Delphi 长字符串的情况略有不同,长字符串看起来象引用,但是如果你改变了该字符串的串变量,那么这个串在更新前将被拷贝下来。作为值参被传递的长字符串只在内存使用和操作速度方面才象引用,但是如果你改变了字符串的值,初始值将不受影响。相反,如果通过引用传递长字符串,那么串的初始值就可以改变。
//这段没问题
function Double(Value : Integer) : Integer;
begin
Double := Value*2;
end;
function vDouble(var Value : Integer) : Integer;
begin
vDouble := Value*2;
end;
//这段没问题
procedure TForm1.Button1Click(Sender: TObject);
var
x : Integer;
begin
x := Double(StrToInt(Edit1.Text));
Label1.Caption := IntToStr(x);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
x : Integer;
begin
x := vDouble(StrToInt(Edit1.Text));
Label1.Caption := IntToStr(x);
end;
[DCC Error] Unit1.pas(53): E2197 Constant object cannot be passed as var parameter
[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
请问怎么解决?? 问题在哪里??
什么是“引用参数?”
Button1 和 Button2 之间有什么分别(有变量和没变量有什么分别??)??