大家别笑我——关于string和pchar(50分)

  • 主题发起人 主题发起人 luckystar
  • 开始时间 开始时间
L

luckystar

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi学习中,我对这样一个问题感到困惑不解,举个例子来说:
1。p:=pchar('object');
q:=pchar('pascal');
strcat(p,q);
edit1.text:=p;

2. p:='object';
q:='pascal';
strcat(p,q);
edit1.text:=p;
均可以得到相同的结果。我就不懂,在Help中strcat的参数为pchar,
为什么赋字符串也行呢,string和pchar都能赋给edit1.text,那么
edit1.text又是什么类型呢?
 
如果赋值时右边是纯字串也是就用单引号引起的不是变量的话,DELPHI将它作PChar看待。
举个例子:
Var
P: PChar;
A: String;
...
P:='BBB'
// OK
...
P:=A
// NO
其实在API引用时都可以看到这一点的。
 
再举个例(送佛送到西),
Messagebox(handle, 'MyDlg', .....) // OK
如果想将'MyDlg'处做成字串,如Format函数的结果,则只能是:
Messagebox(Handle, PChar(Format(...)), ...)
因为Format的结果是字符串,必须用强制类型转换成PCHAR。

我的一点愚见,
字符串String与字符指针PChar虽然在存储格式等有不同,
用String() &amp
PChar()函数可以很方便转换。
不过就事论事来说,这应该是DELPHI为了省事的缘故,
在编译时觉得如果需要成PChar格式来放的就按它的格式放,不需要就放成字串。
如果一定是字串、象变量/函数值,则它不能确定结果,
于是必须将这个转换的任务放在运行时,就必须加上强制转换函数。

不知这样说您可明白?
 
仅供参考:传统Pascal的字符串限制在255个字符以内,而在Delphi的
32位版本中引进了对长字符串的支持,从而克服了传统Pascal的这一约
束.Delphi有三个字符串类型:1)ShortString(短字符串)类型
2)ANSIString(ANSI字符串)类型
3)WideString(广域字符串)类型,
其中第一种类型对应于传统Pascal字符串,第二种类型是新的变长度的
长字符串,这种类型的字符串可被动态分配内存且大小几乎没有限制,第
三种类型主要被OLE界面单元使用.
在Delphi的32位版本中,字符串类型缺省为ANSIString类型,这种
类型的字符串是零终止的,且当声明一个String类型的变量时,它实际上
代表内存中的一个指针,指向堆中的一块区域,这与PChar很相似.
从以上说明我想你该有些明白了:在大多数情况下,PChar与String(ANSIString)
是兼容的.并且在Delphi中,PChar到字符串的转换是自动的.因而你的
上述代码的结果是一样的.
 
PChar类型可以自动转换到String类型的。
而Edit1.text 是String类型的,所以在你的例子中,两种赋值是相同的。
但是,有String转到PChar时必须强制转换。
 
sting 和 pchar 都是放字符串的。pchar多个终止符。
 
谢谢各位大虾 :)
 

Similar threads

I
回复
0
查看
724
import
I
I
回复
0
查看
473
import
I
I
回复
0
查看
694
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部