链表,教科书是如下定义的:
type
PData = ^Tdata;
Tdata = record
d:string;
next:PData;
end;这里的PData是指针,指向下一个链接。
我在使用时,用new开辟空间
p:PData;
new(p);
p^.d:='数据'
p^.next=nil
.....
现在,我把 p^.d 改为 p.d 也没有问题,就有些纳闷,p是指针呀,为什么p.d会没有问题。另外一个问题,如果结点使用类,即
type
PData = ^Tdata;
Tdata = class
d:string;
next:PData;
end;
因为类可以包含方法。p:PData;
new(p);这时用new(p)分配空间就出现问题。我再这样定义:t:=TData;
sizeof(t),发觉值为4,说明这时t其实就是实例的一个指针!!
用new(p)分配空间显然系统不知道需要分配多少。就报错,而且是随机的报错,因为出现了内存溢出,不安全。如此,delphi 如何实现链表更好呢?如何动态分配空间呢?
有人提出,delphi可以抛弃指针的概念,分配空间一律使用类的create。
链表节点中的next,即为自身的指针。
但问题还是出现了:
type
Tdata = class
d:string;
next:TData;
end;这在delphi中是不允许定义的。因为Tdata内不可能定义Tdata。
请高手指教。
type
PData = ^Tdata;
Tdata = record
d:string;
next:PData;
end;这里的PData是指针,指向下一个链接。
我在使用时,用new开辟空间
p:PData;
new(p);
p^.d:='数据'
p^.next=nil
.....
现在,我把 p^.d 改为 p.d 也没有问题,就有些纳闷,p是指针呀,为什么p.d会没有问题。另外一个问题,如果结点使用类,即
type
PData = ^Tdata;
Tdata = class
d:string;
next:PData;
end;
因为类可以包含方法。p:PData;
new(p);这时用new(p)分配空间就出现问题。我再这样定义:t:=TData;
sizeof(t),发觉值为4,说明这时t其实就是实例的一个指针!!
用new(p)分配空间显然系统不知道需要分配多少。就报错,而且是随机的报错,因为出现了内存溢出,不安全。如此,delphi 如何实现链表更好呢?如何动态分配空间呢?
有人提出,delphi可以抛弃指针的概念,分配空间一律使用类的create。
链表节点中的next,即为自身的指针。
但问题还是出现了:
type
Tdata = class
d:string;
next:TData;
end;这在delphi中是不允许定义的。因为Tdata内不可能定义Tdata。
请高手指教。
1,现在,我把 p^.d 改为 p.d 也没有问题,就有些纳闷,p是指针呀,为什么p.d会没有问题。
p.d 等效于 p^.d ,其实还是p^.d,这是编译器自动完成的。2,
。
呵呵,不说了。楼主根本就是概念糊涂,我这里也懒得打字了
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
PData = ^Tdata;
Tdata = class
d:string;
next:PData;
end; type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
p:PData;
begin
new(p);
p.d:='wwww';
end;end.
运行后确实出现问题。
type
PData = ^Tdata;
TData = record
d:string;
next:PData;
end;procedure TForm1.Button1Click(Sender: TObject);
var
p:PData;
begin
new(p);
p.d :='wwww';
p.next := nil;
ShowMessage(p.d);
end;
type
TData = class
public
d:string;
next:TData;
end;procedure TForm1.Button1Click(Sender: TObject);
var
p:TData;
begin
p := TData.Create;
p.d :='wwww';
p.next := nil;
ShowMessage(p.d);
end;
maozefa第一个例子,使用的,record,这确实没有问题。
第二个例子了,没有使用指针,其实class变量本身就是指针。
总之还是感觉到与c语言中严格。可能是编译时有些智能,反而把我整糊涂了。
“p.d 等效于 p^.d ,其实还是p^.d,这是编译器自动完成的。”这本身就不严谨的。
所以我们说C语言是指针的语言,pascal语言不是。