pchar与string有什么区别?

dedema 2001-11-09 11:58:32
pchar与string都是指针变量!
可以如下地使用它们:
var p:pchar;
s:string;
begin
p:='abc';
s:='abc';
end;
以上的赋值过程,是不是都是把字符串'abc'在内存中的首地址赋给p与s?
欢迎指教!
...全文
3078 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
dedema 2002-02-15
  • 打赏
  • 举报
回复
string它的赋值过程是怎么样的?
eulb 2002-02-15
  • 打赏
  • 举报
回复
to thedream(梦幻使者)
现在(delphi6)应该可以用p:='abc';的了
字符串string、字符数组与指向字符串的指针pchar的区别与联系

  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。

  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。

  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误:

  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'}

  var
  s:string;
p:pchar;
  begin
  s:='new';
  label1.caption:=s; {new}
 label2.caption:=intTostr(integer(s[0]));{3是字符串的长度}

  p:=@s[1];{不是以0结尾,莫用pchar型指针}
   label3.caption:=strpas(p); {运行时出现错误}
  end;



  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。

  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:string;
p:pchar;
  begin
  p:=@s[1];
  s:='new'+char(0); {以0结尾,可用pchar型指针}
  label1.caption:=strpas(p); {new}
  label2.caption:=s; {new}
   label3.caption:=intTostr(integer(s[0])); {4是字符串长度  end;



  例3: 用strpcopy函数赋值会在字符串s结尾自动加0。

  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:string;
p:pchar;
  begin
  p:=@s[1];
 strpcopy(p,'new');{strpcopy函数在字符串结尾自动加0}
  label1.caption:=strpas(p);{new}
   label2.caption:=s;{new}
  label3.caption:=intTostr(integer(s[0]));{4}
  end;



  2、下标为0的字符串标识符存放的是字符串长度,字符型数组基本相当于字符串,但不能存放字符串长度。字符串可以用s:='a string'的形式赋值,但是字符型数组a[ ]不可直接用a:='array'的形式赋值,用此种形式会出现类型不匹配错误,可选用strpcopy函数赋值。



  例4: 字符型数组s[ ]相当于字符串,但没有存放字符串长度的位置。

  {s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:array[1..10] of char;
p:pchar;
  begin
  {s:='new'+char(0); error}{错误}
  p:=@s[1];
  {p:=@s; is not correct}
  strpcopy(p,'new');
  label1.caption:=strpas(p);{new}
  label2.caption:=s;{new}
   {label3.caption:=intTostr(integer(s[0]));}{不会出现4, 下
超出错误}
  end;


  例5:下标从0开始的字符数组s,s相当于@s[0]。

  { s[0]='n' s[1]='e' s[2]='w' s[3]=0;}{p-->'new'}
  var
s:array[1..10] of char;
p:pchar;
  begin
  {s:='new'+char(0); error}{错误}
  p:=s;
  {p:=@s[0] is also correct}
  strpcopy(p,'new');
  label1.caption:=strpas(p);{new}
  label2.caption:=s;{new}
  label3.caption:=s[0];{n}
end;


  3、下标从0开始和从1开始的字符数组地址的表示方法也有细微不同:



  例6:下标从1开始的数组a 与下标从0开始的数组b 的比较。

  var
a:array[1..10]of char;
b:array[0..10]of char;
  {a:='1..10';}{type mismatch}
  {b:='0..10';}{type mismatch}
begin
  strpcopy( b, 'from 0 to 10'); {正确 因为b即是@b[0] }
  strpcopy(@b[0], 'from 0 to 10'); {正确 与上个表达式
果相同}
  strpcopy(@a[1], 'from 1 to 10'); {正确 }
  strpcopy( a, 'from 1 to 10'); {类型匹配错误 因为a即是a[0]}
end;


dregs 2002-02-15
  • 打赏
  • 举报
回复
string:他由char字符组成,其长度没有限制,同时与null结束的字符串相兼容!
pchar:指向null结束的char字符串的指针,类似于C语言中的char*或lpstr类型!



redlegend_126_com 2002-02-15
  • 打赏
  • 举报
回复
可以 这样转换,你可以查看f1,查以str开头的所有函数,你就可以找到你要的转换函数了!祝你成功!
wwwxuhong 2001-11-20
  • 打赏
  • 举报
回复
补充一点string是delphi特有的,与其他语言不兼容,故在dll参数中一般用pchar
weijian7111a 2001-11-20
  • 打赏
  • 举报
回复
pchar是以NULL结尾的,这很重要。
黄纸片 2001-11-20
  • 打赏
  • 举报
回复
好像不是4G
ShortString 255 characters
AnsiString ~2^31 characters
WideString ~2^30 characters
如果你的编译器条件没有改变的话, String = AnsiString, 内存自管理的动态字符串
dedema 2001-11-18
  • 打赏
  • 举报
回复
TO tsbob(不想笑)!
你的回答不错的。不过,是2^8而不是2^16。
不过,string类型的变量可以接受长达4G个字符串吗?
我第一次听说的!
xswj77 2001-11-18
  • 打赏
  • 举报
回复
string是delphi内定义类型,pchar则是一个指针字符串
,pchar 好像后缀有#0。相互转换的话strpas(pchar);//pchar转成string
strpcopy(pchar,string); 或直接pchar(string) //string转成pchar
hssfox 2001-11-18
  • 打赏
  • 举报
回复
关注
tsbob 2001-11-18
  • 打赏
  • 举报
回复
shortstring只是一个数组,2^16可以放255个元素,第一个位置用来放数组大小
stirng,和pchar差不多,delphi中的string就是那来和pchar兼容的,都是指向一个字符串的地址值,而这个字符串的长度通过最后的null来判断,但是string在负偏移处用2个字节存放串的长度,所以string最长为4G,如果是局部变量,在负偏移处,还有2个字节做计数器,计算引用次数
pchar类型的变量可以直接付给pchar
var
s:string;
p:Pchar;
begin
p:='dfjaf';
SetLength(s,10);
s:=p;
//直接赋值
p:=pchar(s);
//要强制转花的
tuboo 2001-11-18
  • 打赏
  • 举报
回复
string可分为shortstring,anistring,widestring,默认下是anisstring,与pchar是一样的都是以null结尾的,而shorstring不是以null结尾的,以null结尾的字符串通常在调用win32api函数时做参数。
tongdings 2001-11-16
  • 打赏
  • 举报
回复
两者都应该有内存的,但是string是没有结束符,而pchar是有的
还有两者是可以相互赋值的
tongdings 2001-11-16
  • 打赏
  • 举报
回复
两者都应该有内存的,但是string是没有结束符,而pchar是有的
还有两者是可以相互赋制值的
cszhz 2001-11-15
  • 打赏
  • 举报
回复
pchar使用前必须配内存,string则不用。
dedema 2001-11-14
  • 打赏
  • 举报
回复
to tlovexyj(菠萝菠萝蜜)
请祥细说明, string类型变量的赋值过程!谢谢!
dext 2001-11-13
  • 打赏
  • 举报
回复
string to pchar PChar()
pchar to string StrPCopy()
tlovexyj 2001-11-13
  • 打赏
  • 举报
回复
pchar 是
string 不是(它把'abc'复制到自己里面)
peterluolaw 2001-11-13
  • 打赏
  • 举报
回复
pchar may be anything, but an empty string is not NULL, it's char(0).
dedema 2001-11-11
  • 打赏
  • 举报
回复
没有正面回答我的问题的啊?我现在给这贴子加分,让人人都有分的!
加载更多回复(10)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧