指针的使用. ( 积分: 50 )

  • 主题发起人 主题发起人 liangexcel
  • 开始时间 开始时间
L

liangexcel

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TData=packed record
case Integer of
0: (
IntData:Integer;
ExtData:array[0..2]of Byte );
1: ( Data:array[0..6]of Byte )
end;
var
m:integer;
i1,i2,i3,i4,i5,i6,i7:Byte;
pData:^TData;
p:Pointer;
Frq,tx,ty,t,t0,t1,t2,t3:Int64;
str:string;
strList:Tstrings;
Const
iLength :integer =8347680 ;
begin
strList :=TstringList.Create;
try
QueryPerformanceFrequency(Frq);
QueryPerformanceCounter(tx);
p := GetMemory(iLength*sizeof(TData));
pData:= p;
for i1:=1 to 30 do
for i2:=i1+1 to 31 do
for i3:=i2+1 to 32 do
for i4:=i3+1 to 33 do
begin
m:=(i1 shl 24) or (i2 shl 16) or (i3 shl 8) or i4;
for i5:=i4+1 to 34 do
for i6:=i5+1 to 35 do
for i7:=i6+1 to 36 do
begin
with pData^ do
begin
IntData:=m
//一次写入前4个Byte
ExtData[0]:=i5;
ExtData[1]:=i6;
ExtData[2]:=i7;
end;
Inc(pData);
end;
end;
finally
freeMem(p, iLength*sizeof(TData));
strList.Free;
end;
原帖太长,所以截下了一部分.这个是别的高手使用指针的例子.按这个例子,得出的结果是一个记录型的指针数组.这种指针,是怎么使用的?就是pData值,假如这是一个函数,我想返回的就是这种记录型的数据,怎么把这个指针的值在这个函数完成后在别的过程仍然能用,不用后又能释放内存?
还有,这个指针是怎么定位的?例如我想取800-900之间的100条记录,怎么定位?
我知道这是一些基础的问题,但还是希望能得到你的帮助.
 
申请内存的操作实际上是GetMem这句分配的,它分配了iLength * SizeOf(TData)个字节的内存(TData从声明中可以看出,它是一个TData是一个7个字节的内存块,所以实际上就等于分配了iLength * 7这么大的内存);而释放内存的操作在Finally语句下面的FreeMem。如果你希望在这个函数外仍然使用这个指针指向的内存块,只要取消掉FreeMem这句,并把p这个指针的值传递给外部程序就可以直接使用了。不过如果p传到外部,请一定记得在不需要使用p指向的内存块的时候用FreeMem释放它,否则这块内存就会成为泄漏内存不必要的占用内存空间了。

关于pData,用一个形象的比喻理解,把GetMem申请的内存块看作一张很长的纸,上面写了许多0101这样的二进制数据,那么pData就等于一个镂空的尺(尺的镂空大小正好是7字节),把这个尺子按照一定的位移距离在纸张上移动,你就可以把每次移动后镂空的部分看作一个数值,读取并使用。就是这么简单。
 
如果是数组的话,可以用FOR进行800-900之间最值,但是这样的指针,怎么做相同结果的操作?
 
MyPtr:=@MyArray[800]
//指向数组的第800个元素
for i:=1 to 900-800 do
begin
//... 访问 MyPtr 所指向的内容
Inc(MyPtr);
end;
 
那如何知道当前的位置呢?
 
又如何知道是否到了结尾呢?
 
Position:=(LongWord(MyPtr)-LongWord(@MyArray[0])) div SizeOf(MyArray[0]);
至于是否到了末尾,判断 MyPtr 与 数组最后一个元素的地址的大小关系就知道了。
 
建议楼主看看数据结构中的链表
 
pData:= p;//初始化指针,使它指向第一条记录。
Inc(pData,900);//移动指针,使它指向第900条记录。

代码中定义的p:Pointer是用来保存GetMem分配的内存的位置,以便在不用的时候用释放内存。你可以把它定义成公共变量,这样你就可以在别的过程中进行内存的释放。
 
又是两位高人,谢谢你们啦,我再啄磨涿磨
 
zqw0117的回帖第二段值得楼主好好琢磨,这是理解你的问题的核心之所在(虽然看似简单),理解透了你会受益非浅。
 
后退
顶部