如果访问它:
for I:=0 to High(Data) do
for J:=0 to High(Data[I]) do
begin
...
end;
我想问一下,可不可以将它当一个指针来使用,如何访问它的值?
...全文
2967打赏收藏
怎样将一个二维数组当指针使用?
声明一个二维数组: 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; 我想问一下,可不可以将它当一个指针来使用,如何访问它的值?
代码如下:
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
正如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;
缺点是必须固定第一维的维数。