现在有一个记录结构:PRecNum=^TecNum;
TRecNum=record
id: integer;
name: shortstring;
str: shortstring;
hell: array of shortstring;
end;通过new来建立指针数据结构记录并赋值。var pcrn: PRecNum;
new(pcrn);
pcrn.id:=1;
pcrn.name:='harry';
pcrn.str:='create';
pcrn.hell[0]:='ok';现在通过PRecNum(P.data)//这样可以取得P.data指针指向地址数据结构的数据但PRecNum不等于TRecNum也就是说如果有一个函数需要传参数的类型是TRecNum的话,那PRecNum(P.data)是和TRecNum不同,不能传递,应该怎样可以把PRecNum(P.data)转换成TRecNum的不是指针结构类型???
TRecNum=record
id: integer;
name: shortstring;
str: shortstring;
hell: array of shortstring;
end;通过new来建立指针数据结构记录并赋值。var pcrn: PRecNum;
new(pcrn);
pcrn.id:=1;
pcrn.name:='harry';
pcrn.str:='create';
pcrn.hell[0]:='ok';现在通过PRecNum(P.data)//这样可以取得P.data指针指向地址数据结构的数据但PRecNum不等于TRecNum也就是说如果有一个函数需要传参数的类型是TRecNum的话,那PRecNum(P.data)是和TRecNum不同,不能传递,应该怎样可以把PRecNum(P.data)转换成TRecNum的不是指针结构类型???
a:TRecNum;
begin
a:=PRecNum(P.data)^;
PRecNum=^TRecNum;在调用前应先分配内存:setLength(pcrn^.hell,3);
pcrn.hell[0]:='ok';对指针变量赋值最好加上^,如:
pcrn^.id:=1;
pcrn^.name:='harry';
pcrn^.str:='create';
setLength(pcrn^.hell,3);
pcrn^.hell[0]:='ok';如果你的函数的参数据为TRecNum类型,当将指针类型的变量传入时,应加上^。如下
procedure test(p: TRecNum);调用:test(PRecNum(P.data)^);最后不要忘了用dispose()释放你创建的指针
不好意思,PRecNum(P.data)^是可以的, 我自己搞错了。To kkk2000(肥牛):
谢谢你的纠正,另外我想问问如果不加^会不会有什么出错呢?或则隐患呢?
下面的例子你自己比较一下,看看结果。var
pcrn : PRecNum;
begin
new(pcrn);
showMessage(IntToStr(sizeof(pcrn)));
showMessage(IntToStr(sizeof(pcrn^))); //TRecNum结构大小
showMessage(IntToStr(sizeof(@pcrn^))); //实际上 pcrn = @pcrn^
showMessage(IntToStr(DWORD(pcrn))); //指针地址值
dispose(pcrn);
end;