zoukankan      html  css  js  c++  java
  • 关于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 的内存技术在编译时的不同,至于编译成目的码后其实都是一样的。

  • 相关阅读:
    WPF后台生成datatemplate(TreeViewItem例子)
    后台根据数据模版内的子控件获取使用该模版的控件
    逻辑代码实现拼音首字母检索
    自定义LISTBOX内子项为checkbox或者radio时,关于IsChecked绑定
    siliverlight某些事件无法响应
    页面内容不能铺满浏览器窗口的解决方法
    linux sort命令学习
    linux find命令学习
    linux tr命令学习
    linux cat命令学习
  • 原文地址:https://www.cnblogs.com/sonicit/p/1222889.html
Copyright © 2011-2022 走看看