手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

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

来源:互联网 作者:西部数码 时间:2008-04-10
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

有如下代码:
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 
      L_0001: ldind.ref 
      L_0002: ldc.i4.0 
      L_0003: ldc.i4.s 123
      L_0005: stelem.i4

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!