关于记录类型的指针变量:pMyRecord和pMyRecord^在写法上是不是一回事? ( 积分: 50 )

  • 主题发起人 主题发起人 GrassDragon
  • 开始时间 开始时间
G

GrassDragon

Unregistered / Unconfirmed
GUEST, unregistred user!
初学DELPHI,问题愚笨,见笑,请指教!
举例说明:

type
PMyRecord=^TMyRecord;
TMyRecord=record
a: string;
b: integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var p: PMyRecord;
begin
new(p);
p^.a:='abc';
p^.b:=12;
self.Caption:=p.a+inttostr(p.b);
end;

procedure TForm1.Button2Click(Sender: TObject);
var p: PMyRecord;
begin
new(p);
p.a:='abc';
p.b:=12;
self.Caption:=p^.a+inttostr(p^.b);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
tmp: TMyRecord;
p: PMyRecord;
begin
tmp.a:='edf';
tmp.b:=13;
new(p);
p^:=tmp;
self.Caption:=p^.a+inttostr(p^.b);
dispose(p);
end;

Button1Click和Button2Click的执行结果是相同的.

我的第一个问题是:
p^和p两种不同的写法到底是不是一回事,有什么区别?

我的第二个问题是:
是否必须使用dispose(p)来释放内存?
Button3Click中的tmp变量所占内存,在过程执行完后是否会自动释放?
 
第一个问题——P^以及P的效果相同,是因为Delphi编译器自动进行了处理,将结构指针
的"."操作自动转换成了"^."操作——因为针对指针的"."操作本身是没有任何意义的。

第二个问题——必须使用!因为编译器看起来还无法判断为一个指针变量分配的内存空间
会不会被派别的用场(例如赋给全局变量或者函数的out参数什么的进行输出),所以不能
自动的进行释放。在Delphi中,编码分配空间的,也应该编码释放,这是一个规范(字符串
或者静态数组是编译器完全控制的,程序员无需费神主动分配或者清理)。
 
补充一点P和P^的问题
如果在delphi6中
写P的代码在调试的时候看不到指针的内容,只能够看到指针值
但是P^可以
在delphi2006则无所谓

但是建议还是写P^,这样可以看出是一个指针,否则写P不知道是记录还是指针
 
感谢creation-zy的详尽、准确的回答.让我拨云见日。
“字符串或者静态数组是编译器完全控制的,程序员无需费神主动分配或者清理”
我举例中的tmp变量是否是属于“静态”之列,由delphi自动清理?
 
tmp是静态的,只是在方法调用时存在于栈空间,方法结束后随着栈空间一起自然归还。
 
谢谢creation-zy
 
多人接受答案了。
 
后退
顶部