关于PChar和String的转换

1、PChar到string的转换
    可直接赋值,如:
    X: string;
    Y: PChar;

    X := '1';
    Y := '2';

    X := Y; // X=2

2、string到PChar的转换
    一般情况下都可以用PChar('')来强制转换
    Y: PChar;

    Y := PChar('2'); //强制转换。

    但有些情况下如果强制转换,会有字符被截取,结果不完整,如:
    
function  ReplaceString( const  S, OldPattern, NewPattern: PChar): PChar;
var
  value: string;
begin
  value :
=  StringReplace(S, OldPattern, NewPattern, [rfReplaceAll, rfIgnoreCase]);
  Result :
=  @value[ 1 ];//注意这里不能强制转换PChar(value)
end ;

原因:

所谓的 PChar 是指 Char 格式的 Pointer, 我们可以将之看成连续的 Char 形成一个 String, 只是 PChar 是指向那个字串开头内存地址的 Pointer
而 Delphi 的 String 其实是一個指向储存字串内存地址位置的 Pointer ,一个是内存地址的开头 一个是指向储存字串内存位置的开头
所以需要一次转换

        X: String;
        Y: PChar;
所以是 
        Y := PChar(X);
        Y := @X[1];
        Y := @PChar(X)^;
可以知道以下的值是相等的
        Y^ = X[1];
        Y = @X[1] ;
因此 PChar(X)^ 是等于 X[1] (先将X地址化,在取出引用的结果值)

在 Deplhi 对于动态内存的技术,其实是使用二次引用,也因此参数地传递或引用用到位址方面的时候。如果你用的是动态的阵列或是 String 则适用
Dynamic_Array[0] 或 String[1] ,而不是 Dynamic_Array , String ,不然引用到的只是一个指向实际内存开头的地址的位置而已,这就是 Pascal 与 C 的内存技术在编译时的不同,至于编译成目的码后其实都是一样的。

转载于:https://www.cnblogs.com/sonicit/archive/2008/06/16/1222889.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值