pchar是一个指针,相当于c里的char *
string是delphi内定义类型,相当于c++中的类stringp:='abc';严格得说应该是一个 const char *,因为它指向一常量字符串(意味着不可修改)
s:='abc';应该是重载了:=操作。小弟初学,不好意思,在delphi里用c++的观念讲解,想是一样,所以发言。
string是delphi内定义类型,相当于c++中的类stringp:='abc';严格得说应该是一个 const char *,因为它指向一常量字符串(意味着不可修改)
s:='abc';应该是重载了:=操作。小弟初学,不好意思,在delphi里用c++的观念讲解,想是一样,所以发言。
string[n]: char
用于底层一般用pchar,相互转换的话strpas(pchar);//pchar转成string
strpcopy(pchar,string); //string转成pchar
String-->Pchar: pch1:=str1;
简言之,他们互相可以直接赋值!另外,pchar:='abc'; str1:='abc';这样赋值都是对的,从指针的角度去考虑应该不难理解。
string 不是(它把'abc'复制到自己里面)
pchar to string StrPCopy()
请祥细说明, string类型变量的赋值过程!谢谢!
还有两者是可以相互赋制值的
还有两者是可以相互赋值的
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);
//要强制转花的
,pchar 好像后缀有#0。相互转换的话strpas(pchar);//pchar转成string
strpcopy(pchar,string); 或直接pchar(string) //string转成pchar
你的回答不错的。不过,是2^8而不是2^16。
不过,string类型的变量可以接受长达4G个字符串吗?
我第一次听说的!
ShortString 255 characters
AnsiString ~2^31 characters
WideString ~2^30 characters
如果你的编译器条件没有改变的话, String = AnsiString, 内存自管理的动态字符串
pchar:指向null结束的char字符串的指针,类似于C语言中的char*或lpstr类型!
现在(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;