有如下代码:
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
}
.method public static void Change0(int32[]& a) cil managed { // Code Size: 14 byte(s) .maxstack 3 L_0000: ldarg.0