{$APPTYPE CONSOLE}
uses
SysUtils;type
PRec = ^TRec;
TRec = record
I : Integer;
S : String;
end;
procedure ChangeConstParam(const R:TRec); {const声明。编译器将向例程直接传入参数的地址,而不再是使用参数值的引用}
begin
PRec(@R)^.I := 6;{使用指针访问该地址,对原值进行直接修改}
writeln(R.I); {显示修改成功}
end;var
Rec : TRec;
{main function.}
begin
Rec.I := 4;
writeln(Rec.I);
ChangeConstParam(Rec);
writeln(Rec.I); {调试看,修改成功,但是输出后却是原值.不明白???}
readln;
end.输出结果是4、6、4,为什么最后输出会是4而不是6呢?ChangeConstParam内明显是改变成功.
uses
SysUtils;type
PRec = ^TRec;
TRec = record
I : Integer;
S : String;
end;
procedure ChangeConstParam(const R:TRec); {const声明。编译器将向例程直接传入参数的地址,而不再是使用参数值的引用}
begin
PRec(@R)^.I := 6;{使用指针访问该地址,对原值进行直接修改}
writeln(R.I); {显示修改成功}
end;var
Rec : TRec;
{main function.}
begin
Rec.I := 4;
writeln(Rec.I);
ChangeConstParam(Rec);
writeln(Rec.I); {调试看,修改成功,但是输出后却是原值.不明白???}
readln;
end.输出结果是4、6、4,为什么最后输出会是4而不是6呢?ChangeConstParam内明显是改变成功.
應該修改為:
procedure ChangeConstParam(const R:PRec);
procedure ChangeConstParam(const R:PRec);??
begin
Rec.I := 4; // 用了 ebx 来保存 4
writeln(Rec.I);
ChangeConstParam(Rec);
writeln(Rec.I); // Delphi 发现 Rec.I 没有被修改,所以就直接输出了 ebx 里的值
end;将const 形的参数按地址传,目的在于节省在栈上复制参数的“时间”与“空间”消耗。
比如这里:Rect 有 8 个字节大,而一个地址只有 4 个字节。