一个关于指针的问题? ( 积分: 100 )

  • 主题发起人 主题发起人 P_lilac
  • 开始时间 开始时间
P

P_lilac

Unregistered / Unconfirmed
GUEST, unregistred user!
问一个关于指针正确使用的问题:
PDataDic = ^TDataDic;
TDataDic = record
str_cna: string
//中文名称
str_eng: string
//英文名称,
end;

var fldDic : PDataDic;

New(fldDic );

tblDic.str_eng:=adsPublic.fieldbyname('NO').AsString;
tblDic.str_cna:=adsPublic.fieldbyname('NAME').AsString;
fldNO:=PDataDic(GetData()).str_eng;



tblDic^.str_eng:=adsPublic.fieldbyname('NO').AsString;
tblDic^.str_cna:=adsPublic.fieldbyname('NAME').AsString;
tblName:=PDataDic(GetData())^.str_eng;

的写法有什么不一样,
两种写法程序都可以通过编译,但什么才是正确的写法呢,谢谢!
 
问一个关于指针正确使用的问题:
PDataDic = ^TDataDic;
TDataDic = record
str_cna: string
//中文名称
str_eng: string
//英文名称,
end;

var fldDic : PDataDic;

New(fldDic );

tblDic.str_eng:=adsPublic.fieldbyname('NO').AsString;
tblDic.str_cna:=adsPublic.fieldbyname('NAME').AsString;
fldNO:=PDataDic(GetData()).str_eng;



tblDic^.str_eng:=adsPublic.fieldbyname('NO').AsString;
tblDic^.str_cna:=adsPublic.fieldbyname('NAME').AsString;
tblName:=PDataDic(GetData())^.str_eng;

的写法有什么不一样,
两种写法程序都可以通过编译,但什么才是正确的写法呢,谢谢!
 
没什么不一样,编译器都可以正确识别,都是正确的,当然,最正规的写法应该是带^的第2种写法。

不过假如
type
PPDataDic = ^PDataDic;
var
tblDic: PPDataDic;
那么必须写成tblDic^.str_eng或tblDic^^.str_eng,这时至少需要一个^
 
不知道楼主对c了解怎样,我觉得上面的两种写就如同
int c

int *c;
c = 5;
*c = 5;
 
楼上真搞笑,var fldDic : PDataDic;这确确实实定义的是指针变量,怎么可能和int c
及 int *c;一样呢?
之所以可以fldDic.str_eng来访问本应该用fldDic^.str_eng访问的str_eng字段,那是因为编译器能够识别区分有类型指针的缘故。PChar指针类型可以p[3]这样访问第四个字符(p+3)^,但其他类型指针就不行,有什么可说的?一切在于编译器呗。
 
因该在于编译器的问题,
刚去翻书了,书上都是按第二种方法书写的,就是不知道这两种方法有没有其它区别?
 
直接引用,没多大的区别,除了要注意上面说的指针的指针的引用情况。
不过with引用时就必须带^啦,只能with tblDic^ do,而不能with tblDic do 。
 
区别在于:
第一种写法,跟delphi的面向对象有关
如:
lst: TLIst;
lst:= Tlist.create;// 申请内存
lst.add(P)
//与楼主的
//tblDic.str_eng:=adsPublic.fieldbyname('NO').AsString;
// tblDic.str_cna:=adsPublic.fieldbyname('NAME').AsString;
// fldNO:=PDataDic(GetData()).str_eng;
//这些差不多。因为所有声明的对象都是一个指针!而 record的声明也可以近似的
//看作 类似对象的声明
第二种:是标准的 pascal写法,是在delphi以前就有了!
 
多人接受答案了。
 
后退
顶部