亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi2005學習筆記3——數組參數的研究

2019-11-18 18:07:52
字體:
來源:轉載
供稿:網友
 

有如下代碼:
  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       L_0006: ldarg.0       L_0007: ldsfld int32[] WinForm.Units.WinForm::bb      L_000c: stind.ref       L_000d: ret }
.method public static void Change2(int32[] a) cil managed{      // Code Size: 42 byte(s)      .maxstack 4      .locals (            int32 num1)      L_0000: ldarg.0       L_0001: callvirt instance object [mscorlib]System.Array::Clone()      L_0006: castclass int32[]      L_000b: starg.s a      L_000d: ldarg.0       L_000e: ldc.i4.0       L_000f: ldc.i4.s 123      L_0011: stelem.i4       L_0012: ldsfld int32[] WinForm.Units.WinForm::bb      L_0017: dup       L_0018: ldlen       L_0019: stloc.0       L_001a: ldarg.0       L_001b: ldloc.0       L_001c: ldc.i4.s 11      L_001e: ble.s L_0023      L_0020: ldc.i4.s 11      L_0022: stloc.0       L_0023: ldloc.0       L_0024: call void [mscorlib]System.Array::Copy([mscorlib]System.Array, [mscorlib]System.Array, int32)      L_0029: ret }


.method public static void Change3(int32[]& a) cil managed{      // Code Size: 31 byte(s)      .maxstack 4      .locals (            int32 num1)      L_0000: ldarg.0       L_0001: ldind.ref       L_0002: ldc.i4.0       L_0003: ldc.i4.s 123      L_0005: stelem.i4       L_0006: ldsfld int32[] WinForm.Units.WinForm::bb      L_000b: dup       L_000c: ldlen       L_000d: stloc.0       L_000e: ldarg.0       L_000f: ldind.ref       L_0010: ldloc.0       L_0011: ldc.i4.s 11      L_0013: ble.s L_0018      L_0015: ldc.i4.s 11      L_0017: stloc.0       L_0018: ldloc.0       L_0019: call void [mscorlib]System.Array::Copy([mscorlib]System.Array, [mscorlib]System.Array, int32)      L_001e: ret }
結論:
使用array of Int32 方式,實際上對應于C#的可變數目參數,即 params Int32[],
這種參數方式是傳遞的數組的首地址(即參數的值),而不是存放數組首地址的變量的地址
加上Var修飾,即加入ref修飾,傳遞的是存放數組首地址的變量的地址(即參數變量自身的地址)







使用Ta方式,則在函數內部對數組的值進行克隆,既不改變數組的首地址,也不改變原數組的值
加入var 修飾,好像傳遞的是變量自身的地址,這里還是沒看懂是為什么。





對應的C#代碼為

public static void Change(params int[] a){      a[0] = 0x7b;      a = WinForm.bb;}

public static void Change0(params ref int[] a){      a[0] = 0x7b;      a = WinForm.bb;}

public static void Change2(int[] a){      a = (int[]) a.Clone();      a[0] = 0x7b;      int num1 = WinForm.bb.Length;      if (num1 > 11)      {            num1 = 11;      }      Array.Copy(WinForm.bb, a, num1);}

public static void Change3(ref int[] a){      a[0] = 0x7b;      int num1 = WinForm.bb.Length;      if (num1 > 11)      {            num1 = 11;      }      Array.Copy(WinForm.bb, a, num1);}

上一篇:Delphi程序設計綜合訓練任務書

下一篇:Delphi2005學習筆記1

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费网| 成人h视频在线| 欧美激情视频在线免费观看 欧美视频免费一| 91九色国产社区在线观看| 97久久精品在线| 国产精品久久久久77777| 国产女人18毛片水18精品| 欧美人与物videos| 久久亚洲精品国产亚洲老地址| 午夜剧场成人观在线视频免费观看| 欧美激情一区二区久久久| 精品一区二区亚洲| 欧美成在线视频| 欧美日韩免费观看中文| 性色av一区二区咪爱| 精品无人区乱码1区2区3区在线| 亚洲大尺度美女在线| 亚洲最新中文字幕| 热门国产精品亚洲第一区在线| 精品亚洲一区二区三区| www.日韩系列| 欧美高清视频在线观看| 成人久久18免费网站图片| 色中色综合影院手机版在线观看| 精品国产成人在线| 久久精品电影一区二区| 懂色av影视一区二区三区| 日韩在线观看免费高清| 日韩中文字幕网| 91亚洲午夜在线| 亚洲白虎美女被爆操| 国产欧美精品一区二区三区-老狼| 亚洲人免费视频| 欧洲亚洲女同hd| 亚洲最大的免费| 久久久国产精彩视频美女艺术照福利| 国产中文字幕日韩| 色偷偷偷亚洲综合网另类| 欧美高跟鞋交xxxxhd| 欧美激情va永久在线播放| 91精品久久久久久久久不口人| 久久久国产视频91| 久久视频在线观看免费| 中文字幕av一区二区三区谷原希美| 理论片在线不卡免费观看| 久久国产精品影视| 成人有码在线播放| 5252色成人免费视频| 国产丝袜精品视频| 久久久久久久久久国产| 国产一区深夜福利| 国产精品久久久久高潮| 日韩av在线资源| 成人免费视频网址| 欧美插天视频在线播放| 在线观看免费高清视频97| 久久久精品久久久| 98精品国产高清在线xxxx天堂| 亚洲欧美资源在线| 亚洲成在人线av| 欧美在线观看日本一区| 日韩av在线高清| 久久激情视频久久| 亚洲国产精彩中文乱码av| 欧美巨乳美女视频| 国产欧美亚洲精品| 成人欧美一区二区三区在线湿哒哒| 欧美精品第一页在线播放| 午夜精品www| 日本精品久久久久影院| 亚洲奶大毛多的老太婆| 日韩黄色高清视频| 日韩中文在线观看| 中文字幕欧美视频在线| 国产精品白丝jk喷水视频一区| 久久99热精品这里久久精品| 亚洲精品www| 亚洲在线免费视频| 7777免费精品视频| 国产精品永久在线| 91免费视频网站| 日本精品视频在线| 成人免费观看49www在线观看| 亚洲成人黄色网址| 欧美日韩精品在线| 久久99久国产精品黄毛片入口| 国产香蕉一区二区三区在线视频| 国产专区精品视频| 97超级碰碰人国产在线观看| 久久精品国产2020观看福利| 亚洲爱爱爱爱爱| 国产成人精品在线观看| 国产精品嫩草影院久久久| 亚州欧美日韩中文视频| 亚洲欧洲日本专区| 欧美成人精品激情在线观看| 超碰97人人做人人爱少妇| 欧美成人在线影院| 久久久久久综合网天天| 亚洲欧美国产一本综合首页| 欧美极品在线视频| xxxx性欧美| 久久久久久久国产精品| 国产精品日日摸夜夜添夜夜av| 国产精品jvid在线观看蜜臀| 国产精品爽黄69天堂a| 亚洲精品91美女久久久久久久| 亚洲男人av电影| 久久久久亚洲精品国产| 欧美极品在线视频| 国产91在线播放九色快色| 久久久久久久久久久人体| 日韩精品在线观看一区| 久久久女人电视剧免费播放下载| 午夜精品久久久久久久久久久久久| 亚洲女人被黑人巨大进入al| 亚洲精品网站在线播放gif| 日韩欧美在线视频日韩欧美在线视频| 成人精品网站在线观看| 日韩一级黄色av| 色综合色综合久久综合频道88| 欧美成人中文字幕| 亚洲欧美另类中文字幕| 国产精品88a∨| 亚洲日本中文字幕| 91在线免费网站| 久久亚洲一区二区三区四区五区高| 中文在线资源观看视频网站免费不卡| 国产在线精品播放| 欧美视频在线免费看| 国产丝袜精品第一页| 精品无人区乱码1区2区3区在线| 中文字幕亚洲专区| 久久久av免费| 日韩av在线天堂网| 一个色综合导航| 精品国偷自产在线视频| 亚洲尤物视频网| 亚洲福利视频在线| 亚洲精品国产精品自产a区红杏吧| 欧美大荫蒂xxx| 日韩美女av在线| 欧美视频精品一区| 国产精品久久久久久av福利软件| 亚洲天堂av女优| 亚洲精品视频在线观看视频| 亚洲欧洲成视频免费观看| 国产丝袜高跟一区| 国产精品白嫩初高中害羞小美女| 国产精品福利在线| 日韩欧美亚洲国产一区| 欧美性高潮在线| 亚洲精品久久久久国产| 一区二区三区无码高清视频| 久久精品福利视频| 亚洲第一福利视频| 亚洲一区二区日本| 久久激情视频久久| 国内外成人免费激情在线视频| 日韩欧美国产骚| 欧美成人高清视频| 黄网站色欧美视频| 国产在线精品播放| 国产精品扒开腿做爽爽爽的视频|