链表,教科书是如下定义的:
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.   

    楼主还是买本Delphi的书看比较好。
      

  2.   

    建议你还是多看看delphi的基础书籍。
    1,现在,我把   p^.d   改为   p.d   也没有问题,就有些纳闷,p是指针呀,为什么p.d会没有问题。
    p.d 等效于 p^.d ,其实还是p^.d,这是编译器自动完成的。2,

    呵呵,不说了。楼主根本就是概念糊涂,我这里也懒得打字了
      

  3.   

    unit Unit1;interfaceuses
      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.
    运行后确实出现问题。   
      

  4.   


    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;
      

  5.   


    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;
      

  6.   

    可参考Delphi里TList、TStrings的源码
      

  7.   

    谢谢。
    maozefa第一个例子,使用的,record,这确实没有问题。
    第二个例子了,没有使用指针,其实class变量本身就是指针。
    总之还是感觉到与c语言中严格。可能是编译时有些智能,反而把我整糊涂了。
    “p.d 等效于 p^.d ,其实还是p^.d,这是编译器自动完成的。”这本身就不严谨的。
    所以我们说C语言是指针的语言,pascal语言不是。