为什么很多代码使用Recored时候实际用Record的指针?
比如:  TMyInfo=^PMyInfo ;
  PMyInfo = record
    a:Integer;
    b:String[7];
  end;为什么用TMyInfo 而不直接用PMyInfo ?一直不解.

解决方案 »

  1.   

    你写的是链表,习惯是
    PMyInfo=^TMyInfo ;
      TMyInfo = record
        a:Integer;
        b:String[7];
      end;
    因为可以无长度限制(内存允许)
    ----------------
    当然可以直接使用记录数组MyInfo=array[0..7] of  TMyInfo ;//大小不能改变
    -----
    看具体情况了
      

  2.   

    一般主要是为了能够添加到链表,或者保存用。
    因为局部定义的PMyInfo会自动分配空间,但是方法结束后,就自动删除了。
    而用TMyInfo的时候,要自己手动分配空间,New(...),而且,如果不手动删除dispose(...)的话,会一直存在。
      

  3.   

    一般是用来动态创建的。
    动态创建记录和静态记录在赋值的时候是不同的。
    两个静态记录间的赋值是值拷贝,相当于我有一本书,你也想看,所以你准备一个和我的书一样大小页数的本子,然后照着我的书抄写一遍;
    动态分配的记录的指针的赋值是指针指向的转换,相当于你从我这里拿走书,以后再说起来“你的书”(相当于指向书的指针)就是指这本书了,你可以从书里得到你要的信息,但是不用再准备本子(相当于空间)和抄写(值拷贝)
    可以看到静态方式在进行传递的时候需要更多的空间和时间。所以在需要多层传递,或者需要记录的数目无法确定时一般会使用动态方式。
    比如下面的两个数组
      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中对象总是动态创建的。