记录指针 ( 积分: 10 )

  • 主题发起人 主题发起人 Michaeldeng
  • 开始时间 开始时间
M

Michaeldeng

Unregistered / Unconfirmed
GUEST, unregistred user!
-----------1------------
Type
PStudent = ^TStudent;
TStudent = Record;
Name: string;
Age: Integer;
end;
-----------2------------
Type
TStudent = Record;
Name: string;
Age: Integer;
end;
PStudent = ^TStudent;
请问这两种定义有什么区别,即 PStudent = ^TStudent;的位置放在记录体前或后面有什么不同吗?
 
-----------1------------
Type
PStudent = ^TStudent;
TStudent = Record;
Name: string;
Age: Integer;
end;
-----------2------------
Type
TStudent = Record;
Name: string;
Age: Integer;
end;
PStudent = ^TStudent;
请问这两种定义有什么区别,即 PStudent = ^TStudent;的位置放在记录体前或后面有什么不同吗?
 
效果一样

但是记录本身包含有本身类型的指针,第二种显然不行的,只能用第一种
PStudent = ^TStudent;
TStudent = Record;
Name: string;
Age: Integer;
Next: PStudent
end;
 
如果用记录指针的话
你的记录的声明的方法就有问题了
Name: string 不可
会有内存泄漏的吧
 
to 楼主:
第1种写法是错误的,编译时就不会通过,因为不符合先定义后使用的语法规则。
第2种写法虽然没有语法问题,可是从数据结构的角度讲似乎实用意义不大,因为如果单纯只是在Delphi程序里面的话,好像要用到记录指针的地方并不多。当然如果是做基于指针的记录链表的话就是另外一回事了,不过那要定义成zealothasu写的那样。

to 52free:
记录指针里面也是可以用string类型的域的,不会发生内存泄漏。因为string类型的变量实际上也是一种指针,不过它与普通的变量指针相比有更复杂的内存管理机制而已了。而且它的内存管理是由系统负责的,一般不需要程序员操心。
 
to SparkV:
>第1种写法是错误的,编译时就不会通过,因为不符合先定义后使用的语法规则。
Pascal 或者 Delphi 是有特例的,就是这个纪录指针定义中是可以先使用后定义的,呵呵
 
to tseug:
你好像没有看清楚代码,楼主的第一种写法里面根本就没有写到用记录指针的域啊。
 
第一种定义是有问题,那是因为Record后面多了个分号,并不是因为
PStudent定义时引用了还没有定义的TStudent的缘故,而且这个和那个
纪录里面是不是引用PStudent无关
 
to SparkV:
第1种写法编译时会通过,但是楼主写的有错,TStudent = Record 这句后不应该有‘;’,
这良种效果应该是一样的把
 
嗯,第一种写法是可以通过。不过我个人觉得,如果不是为了做基于指针的记录链表这种数据结构--也就是zealothasu写的那种--的话,还是应该遵守先定义后使用的原则比较好吧。
 
来听一课
 
谢谢各位!
 
后退
顶部