天天看點

delphi裡動态數組和指針的運用

{多元動态數組}

procedure TForm1.BitBtn1Click(Sender: TObject);

var

  Arr: array of array of array of Integer; {定義一個三維動态數組}

  i,j,k,ic,jc,kc: Integer;

begin

  Memo1.Lines.Clear;

  SetLength(Arr, 2,3,4);

  {擷取各維的維數}

  ic := Length(Arr);

  jc := Length(Arr[0]);

  kc := Length(Arr[0][0]);

  {指派}

  for i := 0 to ic - 1 do

    for j := 0 to jc - 1 do

      for k := 0 to kc - 1 do

        Arr[i][j][k] := Random(100);

  {取值}

  Memo1.Clear;

        Memo1.Lines.Add(Format('Arr[%d][%d][%d] = %d', [i, j, k, Arr[i][j][k]]));

end;

{多元動态數組指針}

procedure TForm1.BitBtn2Click(Sender: TObject);

Type

  TMyArr = array of array of array of Integer; {定義一個三維動态數組類型}

  PArr: ^TMyArr; {動态數組指針變量}

  {用作維數的變量}

  ic := 2;

  jc := 3;

  kc := 4;

  {配置設定記憶體; 按說動态數組還需要 8 個管理位元組, 我不知道 Delphi 是怎麼協調的}

  GetMem(PArr, ic * jc * kc * SizeOf(Integer));

  {設定數組}

  SetLength(PArr^, ic,jc,kc);

        PArr^[i][j][k] := Random(100);

        Memo1.Lines.Add(Format('Arr[%d][%d][%d] = %d', [i, j, k, PArr^[i][j][k]]));

        //Memo1.Lines.Add(Format('Arr[%d][%d][%d] = %d', [i, j, k, TMyArr(PArr)[i][j][k]]));

        {按理說這種通路方法也對,可是這中方法在編譯的時候能通的過去,在運作的就報錯了}

  {自己配置設定的記憶體要負責釋放}

  FreeMem(PArr);

procedure TForm1.Button1Click(Sender: TObject);

type

  TArr = array[0..10] of Integer;

  arr: ^TArr;

  i:Integer;

  New(arr);

  {這裡面就有個問題了,New()這函數是有來建立一個新指針,在delphi裡面指針儲存的是位址,也就是說Arr 裡面儲存的是位址碼,并沒有配置設定記憶體,可是為什麼Arr^[i]卻還能夠指派呢?}

  for i := 0 to 10 do

    Arr^[i]:=i*i;

    Memo1.Lines.Add(Format('Arr[%d] = %d', [i, Arr^[i]]));

  Dispose(arr);

  {這個Dispose釋放的是指針,也就是說把Arr儲存的位址值清為零,那麼用來儲存資料的記憶體位址是怎麼釋放的?}

繼續閱讀