为什么很多代码使用Recored时候实际用Record的指针?
比如: TMyInfo=^PMyInfo ;
PMyInfo = record
a:Integer;
b:String[7];
end;为什么用TMyInfo 而不直接用PMyInfo ?一直不解.
比如: TMyInfo=^PMyInfo ;
PMyInfo = record
a:Integer;
b:String[7];
end;为什么用TMyInfo 而不直接用PMyInfo ?一直不解.
解决方案 »
- delphi高手请这边看,跪求解答,很着急!!!
- 不用WebBrowser,还有什么控件可以打开网页并且像WebBrowser一样始终保持连接
- 宝兰为Delphi7推出正式中文包
- delphi现在最常用的数据库访问组件是什么
- 关于delphi7中的Activexform
- 客户端主表主键唯一性的检查?
- 高分请教,如何用Delphi实现Active Documents,只要对我有帮助,都有分。
- 请问怎么用Unit作为程序启动的入口,而不是用窗体作为启动。(delphi2005)在线等。
- 关于控件的整体移动……高手低手请帮忙(up有分)
- FastReport的问题??
- 很急的问题:如何动态变化Record Type文件的记录类型?(既如何传递动态的 Record)
- FastReport打印完毕停止,而不是一直把整张纸都走完?
PMyInfo=^TMyInfo ;
TMyInfo = record
a:Integer;
b:String[7];
end;
因为可以无长度限制(内存允许)
----------------
当然可以直接使用记录数组MyInfo=array[0..7] of TMyInfo ;//大小不能改变
-----
看具体情况了
因为局部定义的PMyInfo会自动分配空间,但是方法结束后,就自动删除了。
而用TMyInfo的时候,要自己手动分配空间,New(...),而且,如果不手动删除dispose(...)的话,会一直存在。
动态创建记录和静态记录在赋值的时候是不同的。
两个静态记录间的赋值是值拷贝,相当于我有一本书,你也想看,所以你准备一个和我的书一样大小页数的本子,然后照着我的书抄写一遍;
动态分配的记录的指针的赋值是指针指向的转换,相当于你从我这里拿走书,以后再说起来“你的书”(相当于指向书的指针)就是指这本书了,你可以从书里得到你要的信息,但是不用再准备本子(相当于空间)和抄写(值拷贝)
可以看到静态方式在进行传递的时候需要更多的空间和时间。所以在需要多层传递,或者需要记录的数目无法确定时一般会使用动态方式。
比如下面的两个数组
a: Array[1..100] of PMyInfo; //所用空间是100个PMyInfo的大小(1个整型加7个字符型)
b: Array[1..100] of TMyInfo; //所用空间是100个指向PMyInfo的指针(相当于整型的大小)
顺便说一下,一般情况下是把指针声明为P开头,具体的类型声明为T开头,你写反了。
上面的例子并不是说动态的方式优于静态的,因为动态分配使程序多了管理内存的问题,因此在没有需要采用动态方式时使用静态就可以了。
此外采用动态分配的方式要小心不要出错,比如,现在我要作的功能是记录每次鼠标点击的位置,我决定用一个TPos记录x,y值,然后写入链表,那么代码可能类似这样。
var
p: TPos;
begin
p.x := Mouse.x;
p.y := Mouse.y;
List.Add(@p);
end;
这里就出现了错误,因为链表中记录的是记录的地址,显然,链表中所有的指针都指向的是p的地址,因而得不到前面记录得值。(另外,p是一个局部变量,在这个过程结束后它得地址就是不可访问的了)
应该写成
p: PPos;
begin
New(p);
p.x := Mouse.x;
p.y := Mouse.y;
List.Add(p);
end;
这样就在每次记录的时候开辟了一个内存用来存放鼠标的位置。(但是别忘了在最后要释放这些空间)。
最后要说的是,在Delphi和任何的面向对象的语言中,都没有必要使用记录类型,Delphi中还存在这些使用是出于兼容的需要。用对象可以处理大部分需要记录的工作,而在Delphi中对象总是动态创建的。