Delphi2005学习笔记3——数组参数的研究[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shidongdong 的 blog

有如下代码:
  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
}

本文关键:Delphi2005学习笔记3——数组参数的研究
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top