指针的疑问(50分)

  • 主题发起人 主题发起人 echolan
  • 开始时间 开始时间
E

echolan

Unregistered / Unconfirmed
GUEST, unregistred user!
例:
TMyClass=Class(TButton)
private
....
Pubilc
PImage:Array[0..NUM-1]of ^TMyImage;
....
end;
PNode:^TMyClass;
使用New(PNode)时,到底是分配的什么空间?(希望能具体说明),
以及在New(PNode)后,如果要创建PImage,是否还需要再对PImage使用New()来分配空间?
 
分配的是堆(heap)内存空间
应在TMyClass的构造函数中为PImage分配空间
 
1分配的是pnode指针的内存空间
2new(pimage)也是分配的指向tmyimage的指针内存空间
下面的代码已编译通过并运行通过
type
tmytype=array [0..1] of tstrings;
var
p:^tmytype;
mytype:tmytype;

new(p);
mytype[0]:=tstringlist.Create;
mytype[1]:=tstringlist.Create;
mytype[0].Add('test');
p:=@mytype;
showmessage(p^[0].Text);
 
更正pimage并不是一个指针,而是一个指针数组,应该new它的每一个成员
以下代码编译运行通过
var
p:array [0..1] of ^tstrings;

new(p[0]);
new(p[1]);
p[0]^:=tstringlist.Create;
p[1]^:=tstringlist.Create;
p[0]^.add('test');
showmessage(p[0]^.Text);
 
在New(PNode)后,如果要创建PImage,是否还需要再对PImage使用New()来分配空间?
=================================================
要分配空间;
不过你这样做好像不大好;继承TButton的create,在create里分配PImage的空间。就行了。
 
1、New(PNode)分配了一个4字节的内存空间, 内容是一个nil指针(就是你的TMyClass类的实例, 因为没有用TMyClass.Create实例化,所以是nil)
也就是说New(PNode)执行後, PNode为指向一个nil指针的指针。
2、New(PNode)後到为对PImage操作之间还需要执行PNode^ := TMyClass.Create(xxx);
3、TMyClass.Create之后, PImage是一个有num个nil指针元素的数组, 所以要操作PImage[n]还必须为每个元素分配一个指针,
根据定义,这个指针和PNode类似, 还是指向另一个指针的指针。 如果想为PImage每个元素指定一个Image, 必须执行类似如下语句:
New(PImage);
PImage^ := TImage.Create(xxxx);

如此定义每种类型都浪费了一个指针, 一般情况下如下指定足够了:
PImage: array [0..NUM-1] of TMyImage;

PNode: TMyClass;
 
对, 设计不合理.
 
后退
顶部