请高手回答关于指针的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 dgl007
  • 开始时间 开始时间
D

dgl007

Unregistered / Unconfirmed
GUEST, unregistred user!
var
p : pointer
begin
if p^ is Integer then//这样判断是错误的,请问有其他办法吗?我想知道指针当前指向的数据是什么类型.//
begin
;
end;
end;
 
var
p : pointer
begin
if p^ is Integer then//这样判断是错误的,请问有其他办法吗?我想知道指针当前指向的数据是什么类型.//
begin
;
end;
end;
 
不可能,指针就是一个32位/64位(本机位数)的整数值,他是没有类型的.(在DELPHI当中)
除非你自己在生成/释放指针的时候,记录,不过这根本不现实
 
你还没有给Pointer分配内存呢,当然不能判断了

Pointer在C里面对应的好像是Void *指针,我主要用他来做一下传值什么的,如果你自己本身不知道他的类型应该就比较麻烦了,另外我记得is操作是针对对象的,也就是说从TObject下来的东西,应该不是简单类型(不确定)

所以要先看看Pointer是不是nil,然后才判断Pointer类型的值是什么类型的

各人意见,仅供参考
 
也许我应该这样写:
var
p : pointer;
i : integer;
begin
i := 9;
p := @i;
if p^ is Integer then//这样判断是错误的,请问有其他办法吗?我想知道指针当前指向的数据是什么类型.//
begin
;
end;
end


其实我是想在delphi里做一个类似java的map类。
 
is操作是针对TObject的,所以不能这么用
 
补充一下:p^ 不是就是等于把p指针指向的内存内容取出来了吗?
 
应该是这个意思
 
ptr : ^Integer;
 
指针一开始是无类型,又不给他赋值,当然不能判断,你只是定义了他的类型还没有为他分配内存
 
要用整形指针:定义一个类型
type
PInt = ^integer;
还可以定义记录类型指针:
type
NodePtr = ^Node
Node = record
data:integer;
msg:string;
next:NodePtr;
end;

其它类型相似。
然后用PInt来定义变量:
var
i:integer;
pi:PInt;
pch:Pchar;//Pchar是delphi预定义的,与string在一定程度上是兼容的
begin
i:=122;
pi:=@i;
pi^:=123;// i 的值也会变成123
end;
这段代码我没时间测试,我能想起来的就是这样,可能有人会鄙视我了,我不在乎,我只是要起一个引导作用
 
pointer是无类型指针,它可以指向任何一个数据类型的第一个字节的地址,因为是无类型指针指针,所以希望通过它来知道数据类型是不可能的,同时也不能通过它使用跳脱字取得地址里的值.但可以把它赋给一个类型指针,再通过类型指针读取地址里的值.
var
i:word;
pi:^smallint;//指向smallint类型的指针,取值长度与smallint一样为2个字节,带正负号
pw:^word
//指向word类型的指针,取值长度与word一样为2个字节,不带正负号
pb:^byte
//指向byte类型的指针,取值长度与byte一样为1个字节,不带正负号
p: pointer;
begin
i:=65535;
p:=@i;
pi:=p;
pw:=p;
pb:=p;
showmessage(inttostr(pi^));
showmessage(inttostr(pw^));
showmessage(inttostr(pb^));
end;
看一下结果,体会一下pointer的含义
 
su37真是高手,可不可以留个方式,交个朋友?
 
我做了几个试验,使用指针如果是在同一个函数内指向简单数据类型没问题,但是如果要让她在函数间传递数据好像就麻烦多了。
 
后退
顶部