怎样将一个二维数组当指针使用?

mastersky 2005-12-15 10:46:56
声明一个二维数组:
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;

我想问一下,可不可以将它当一个指针来使用,如何访问它的值?

...全文
296 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mastersky 2005-12-16
  • 打赏
  • 举报
回复
其实你完全可以分配一大块的内存,然后从逻辑上把它当成二维数组来处理,不要拘泥于形式:)

反过来思考倒是不错,关键是我的数组是带记录(record)的.而且第一维也是不固定大小的.
如果用单纯的指针来操作的话,操作量要多好多.所以想结合起来操作.
没什么好办法就直接用数组来操作了.:)
yxf 2005-12-16
  • 打赏
  • 举报
回复
动态数组本来就是指针

如果是普通固定的二维数组,可以用^array[..., ...] of ...;
mastersky 2005-12-15
  • 打赏
  • 举报
回复
我写了一段测试代码:
二维数组里面每个一维数组是连续的,但是另一层却不是连续的.

代码如下:
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
clasj 2005-12-15
  • 打赏
  • 举报
回复
呵呵,看错了,原来mastersky(浪)就是楼主啊-_-#
clasj 2005-12-15
  • 打赏
  • 举报
回复
正如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;
缺点是必须固定第一维的维数。

其实你完全可以分配一大块的内存,然后从逻辑上把它当成二维数组来处理,不要拘泥于形式:)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧