您好,Pchar() 函数怎么用?(50分)

  • 主题发起人 主题发起人 wjlsmail
  • 开始时间 开始时间
W

wjlsmail

Unregistered / Unconfirmed
GUEST, unregistred user!
Pchar() 函数怎么用?

如下语句的含义:
var s1,s2 : String;

s1 := '1234';
s2 := Pchar(s1) ;
ShowMessage(s2); // 1234
是否为: 取S1的指针赋给S2 ? 那么没有给s1的长度,s2又怎么成了 1234 ?
s2能够看作字符指针吗? 如果可以,那么第三句为何不是: ShowMessage(s2^);---编译有错误

请讲一下Delphi中的字符串和指针,以及Pchar函数 ,谢谢
 
string(pchar)
pchar(string)
之间转换
 
StrCopy()
StrPCopy();
 
pchar不是函数,pchar()是类型强制转换,像c里一样
关于字符串的东西很多,最好看看《Delphi 5 开发人员指南》这本书。
关于你上面的出现的错误,你应该能够想得到
s2被声明为一个string类型变量
s2:=pchar(s1);
的过程就变成:先把s1转换为pchar类型,然后又转换成string类型赋给了s2.
不知道你明白没有。
下面是Delphi关于pchar的解释,供你参考
A PChar is a pointer to a null-terminated string of 8-bit characters.

showmessage(s2^);
如果你要这么访问s2,那么应该是这样showmessage(pchar(s2)^);

-------------
| pchar(s2) | ==> s2
-------------
 
谢谢pipo的回复,谢谢
showmessage(pchar(s2)^); 只能显示S2的首字符; 那么由此可以得出: Pchar(s)只是
得到了S的指针并没有得到长度,那么s2 := Pchar(s1) ; 可以将s1完全赋给s2怎么解释?
如果按您讲的:
先把s1转换为pchar类型,然后又转换成string类型赋给了s2
那么这个“然后又转换成string类型赋给了s2"是自动转换的么?
 
// s2 := Pchar(s1) ; 可以将s1完全赋给s2怎么解释?
谁说这是完全赋值了?还是指针了一下而已啊。因为 string 其实也是指针:)

 
不太理解楼上的观点
string类型变量怎么会是指针?
 
beta : 就是完全赋值呀

pipo: 请您再讲一下好么?

请大家指导,谢谢
 
var s :array[0..100] of char
s1:string;
s :='abcd'+chr(13)+'ddddd';
s1 :=Pchar(s);
showmessage(s1);
 
string是指针,
pchar也是指针
不同的是string有引用记数,pchar没有,
还有<delphi5开发人员指南>上说string也是以#0结尾,不知道是不是真的
 
建议你看一下《Delphi 5 开发人员指南》第二章关于string的论述
 
希望认识beta,请老兄给我讲讲string在内存中的结构
 
又看了一遍《Delphi 5 开发人员指南》中有关string的内容,beta讲得没错,我又进步了
,呵呵
 
to pipo: string 在内存中的结构其实并不神秘,-8 偏移处的一个 DWord 放引用计数
-4 偏移处的一个 DWord 放字符串长度(所以字符串可以达到 4G 长度)

 
Beta:
s2 := Pchar(s1) ;
结果 S2=S1了,怎么说不是完全赋值呢?
 
// 结果 S2=S1了
因为他们指向同一个地方啊:)

而完全赋值的意思应该是两者各有不同的空间,对各自的操作相互不干扰才是吧。
要是你这里把 s1 给改了,那么 ShowMessage(s2) 出来的也就变了,这恐怕与完全
赋值的初衷相矛盾吧:)

 
to beta:《D5开发人员指南》上讲AnsiString的结构为:
|分配的大小|引用计数|长度|DDG|#0|

请问,“分配的大小”是什么意思?
还有,D6帮助文件中对AnsiString长度的定义是4bytes-2GB,而不是4GB
 
“完全赋值“的含义:
我认为:对于Sting来说,完全赋值就是s1=s2,他们相同了
对于Integer来说,完全赋值就是 i1=i2,他们相同了
对于Point来说,完全赋值就是p1=p2,他们指向了同一个地址,他们相同了

望大家继续赐教,继续指导,继续讨论:)
 
string 强制转换为 PChar 时,应小心!!
s:string;
ps:PChar;

s:='1234';
ps:=PChar(s+#0);
 
huawdg您好:类型转化 Pchar(s)有什么危险?
s:='1234';
ps:=PChar(s+#0);

加#0有何含义? 类型转化后不能自动加上么?
还有,
“完全赋值“的含义:
我认为:对于Sting来说,完全赋值就是s1=s2,他们相同了
对于Integer来说,完全赋值就是 i1=i2,他们相同了
对于Point来说,完全赋值就是p1=p2,他们指向了同一个地址,他们相同了

望大家继续赐教,继续指导,继续讨论:)
 
后退
顶部