声明一个二维数组:
Data:array of array of Byte;设置其长度SetLength(Data,10,20);如果访问它:
for I:=0 to High(Data) do
for J:=0 to High(Data[I]) do
begin
 ...
end;我想问一下,可不可以将它当一个指针来使用,如何访问它的值?

解决方案 »

  1.   

    我写了一段测试代码:
    二维数组里面每个一维数组是连续的,但是另一层却不是连续的.代码如下:
    var
      FNum,FDataItemLength:Word;
      FDataPoints:array of array of Byte;
      i,j:Integer;
      p:System.PByte;
      x:array of Integer;
    begin
      Memo1.Clear;
      FNum:=3;
      FDataItemLength:=5;
      SetLength(FDataPoints,FNum,FDataItemLength);
      setLength(x,FNum*FDataItemLength);
      for i:=0 to High(FDataPoints) do
      for j:=0 to High(FDataPoints[i]) do
      begin
        Randomize;
        FDataPoints[i,j]:=RandomRange(0,255);
        Memo1.Lines.Text:=Memo1.Lines.Text+' '+IntToHex(FDataPoints[i,j],2);
      end;
      Memo1.Lines.Add('');
      p:=@FDataPoints[0,0];
      for i:=0 to FNum*FDataItemLength-1 do
        Memo1.Lines.Text:=Memo1.Lines.Text+' '+IntToHex(PByte(Integer(p)+I)^,2);
      Memo1.Lines.Add('');
      for i:=0 to High(FDataPoints) do
      begin
        for j:=0 to High(FDataPoints[i]) do
        begin
          Memo1.Lines.Text:=Memo1.Lines.Text+' '+IntToHex(FDataPoints[i,j],2);
          x[i*FDataItemLength+j]:=Integer(@FDataPoints[i,j]);
        end;
      end;
      memo1.Lines.Add('');
      for I:=0 to High(x) do
        Memo1.Lines.Add(Format('FDataPoints[%d,%d].Address=',
        [I div FDataItemLength,I mod FDataItemLength])
        +IntToStr(x[i]));
    end;结果如下:
     83 CA DB 8F CA CC C8 83 1D F7 9A BB 83 BC 02
     83 CA DB 8F CA 00 00 00 1E 00 00 00 28 AE 42
     83 CA DB 8F CA CC C8 83 1D F7 9A BB 83 BC 02
    FDataPoints[0,0].Address=20021912
    FDataPoints[0,1].Address=20021913
    FDataPoints[0,2].Address=20021914
    FDataPoints[0,3].Address=20021915
    FDataPoints[0,4].Address=20021916
    FDataPoints[1,0].Address=20017292
    FDataPoints[1,1].Address=20017293
    FDataPoints[1,2].Address=20017294
    FDataPoints[1,3].Address=20017295
    FDataPoints[1,4].Address=20017296
    FDataPoints[2,0].Address=19972760
    FDataPoints[2,1].Address=19972761
    FDataPoints[2,2].Address=19972762
    FDataPoints[2,3].Address=19972763
    FDataPoints[2,4].Address=19972764
      

  2.   

    正如mastersky(浪)所说的,地址不连续:)
    SetLength(Data,10,20);
    相当于以下操作:
    SetLength(Data,10);
    for i:=0 to high(Data) do
      SetLength(Data[i],20);
    而不是C++中的new char[10][20];(在C++中这样会分配连续的200个字节的内存,所以可以方便的通过指针运算来访问内存)你可以这样定义你的数组,然后用指针来访问:
    var
      data: array of array[0..19] of byte;
      i, j: integer;
      p: pbyte;
    begin
      setlength(data, 10);
      p:=pbyte(data);
      for i:=0 to high(data) do
        for j:=0 to high(data[i]) do
        begin
          p^:=0;
          inc(p);
        end;
    end;
    缺点是必须固定第一维的维数。其实你完全可以分配一大块的内存,然后从逻辑上把它当成二维数组来处理,不要拘泥于形式:)
      

  3.   

    呵呵,看错了,原来mastersky(浪)就是楼主啊-_-#
      

  4.   

    动态数组本来就是指针如果是普通固定的二维数组,可以用^array[..., ...] of ...;
      

  5.   

    其实你完全可以分配一大块的内存,然后从逻辑上把它当成二维数组来处理,不要拘泥于形式:)反过来思考倒是不错,关键是我的数组是带记录(record)的.而且第一维也是不固定大小的.
    如果用单纯的指针来操作的话,操作量要多好多.所以想结合起来操作.
    没什么好办法就直接用数组来操作了.:)