PChar 和 PWideChar类型兼容于从索引下标0开始的静态字符数组,即可以将索引下标从0开始的静态字符数组赋给PChar 和 PWideChar类型的指针变量。此过程不可逆,即不能将PChar和PWideChar类型的指针变量赋给索引下标从0开始的静态数组。
String 和 PChar 类型混用时,注意:
1.Pascal长字符串赋值兼容PChar类型,所以可以将PChar类型字符串直接赋给string类型的变量.
P1 : PChar;
S1 : String;
P1 := 'June';
S1 := P1;
2:不能将string类型的变量赋给PChar类型的变量,此时必须进行强制类型转换。PChar(S)
S1 := 'June';
P1 := PChar(S1);
3.PChar类型和String类型可以在双目运算表达式中混合使用。此时如果一个运算对象为String类型,一个PChar类型,则编译器自动将PChar转换为对应长字符串类型,表达式的运算结果为长字符串类型。
4.如果子程序或对象的方法以长字符串为参数,则调用时的参数可以为PChar类型,此时Delphi会自动进行强制类型转换。
//
当一个长字符串类型转换成PChar类型时应注意的问题:
1.如果S为长字符串类型的表达式,PChar(S)将把S转换为以null结尾的字符串,PChar(S)为指向S中第一个字符的指针。
2.如果S为长字符串类型的表达式,可以使用Pointer(S)将S转换为无类型指针。此时如果S为空串,转换结果为null。
3.当长字符串类型的变量S转换为PChar类型的字符指针时,字符指针仅在S没有重新赋值或没有越过作用域时有效。
S1 := 'June';
P1:= PChar(S1); //P1->S1-June
S1 := 'XYZ'; // P1->June
S2 := P1; //P1->June
4.当将长字符串类型的表达式转换为PChar指针类型时,在一般情况下该指针都是只读的,一般不能使用指针修改字符串的内容。如果同时满足下列条件可以安全的使用指针修改长字符串的内容:
--类型转换的对象是长字符串类型的变量
--字符串不是空串
--字符串为唯一的,即其引用记数为1(要保证字符串为唯一的,可以使用SetLength/SetString/UniqueString过程)
--自从进行类型转换后字符串没有被修改过
--所有修改的字符串都位于字符串内部,即字符指针的索引没有越界
S1 := 'June';
P1:= PChar(S1);
P1^ := 'j'; //S1-june
Inc(P1);
P1^ := 'U';//S1-jUne
内容均摘抄自《参透delphi》 乔林著