天天看点

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保存的地址值清为零,那么用来保存数据的内存地址是怎么释放的?}

继续阅读