有如下代码:
procedure change(a:array of int32);
procedure change0(var a:array of int32);
type
ta = array[0..10] of int32;
procedure change2(a:ta);
procedure change3(var a:ta);
var
aa:ta;
bb:array of int32;
implementation
{$autobox on}
procedure change(a:array of int32);
begin
a[0]:=123;
a:=bb;
end;
procedure change0(var a:array of int32);
begin
a[0]:=123;
a:=bb;
end;
procedure change2(a:ta);
begin
a[0]:=123;
a:=bb;
end;
procedure change3(var a:ta);
begin
a[0]:=123;
a:=bb;
end;
然后执行下面的语句
setlength(bb,11);bb[0]:=5678;
aa := ta(&array.createinstance(typeof(int32),11));
aa[0]:=0;
change(aa);
messagebox.show(aa[0].tostring());
if &object(aa)=&object(bb) then messagebox.show('=');
aa := ta(&array.createinstance(typeof(int32),11));
aa[0]:=0;
change0(aa);
messagebox.show(aa[0].tostring());
if &object(aa)=&object(bb) then messagebox.show('=');
aa := ta(&array.createinstance(typeof(int32),11));
aa[0]:=0;
change2(aa);
messagebox.show(aa[0].tostring());
if &object(aa)=&object(bb) then messagebox.show('=');
aa := ta(&array.createinstance(typeof(int32),11));
aa[0]:=0;
change3(aa);
messagebox.show(aa[0].tostring());
if &object(aa)=&object(bb) then messagebox.show('=');
结果发现 array of int32 方式,可以改变数组元素的值,但不能改变数组变量中存储的数组首地址,输出123
var array of int32 既可以改变数组的值,又可以改变数组变量中存储的数组首地址,输出5678和=
ta方式,不能改变数组元素的值,但是却很奇怪,aa和bb指向同一个数组,输出0和=
var ta方式 可以改变数组元素的值,但是却不是5678而是123;但是aa和bb指向同一个数组,输出123和=
反汇编结果如下
method public static void change(int32[] a) cil managed
{
// code size: 13 byte(s)
.maxstack 3
l_0000: ldarg.0
l_0001: ldc.i4.0
l_0002: ldc.i4.s 123
l_0004: stelem.i4
l_0005: ldsfld int32[] winform.units.winform::bb
l_000a: starg.s a
l_000c: ret
}