pchar是一个指针,相当于c里的char *
string是delphi内定义类型,相当于c++中的类stringp:='abc';严格得说应该是一个 const char *,因为它指向一常量字符串(意味着不可修改)
s:='abc';应该是重载了:=操作。小弟初学,不好意思,在delphi里用c++的观念讲解,想是一样,所以发言。

解决方案 »

  1.   

    p:='abc'应该会出错的,改为p:=pchar('abc')
      

  2.   

    string->pchar :pchar(string)
    string[n]: char
      

  3.   

    pchar在window中是通用得,string不通用。
      

  4.   

    string是delphi内定义类型,pchar则是一个指针字符串
    用于底层一般用pchar,相互转换的话strpas(pchar);//pchar转成string
    strpcopy(pchar,string);  //string转成pchar
      

  5.   

    转换如下:(pch1:pchar;  str1:String;)Pchar-->String: str1:=pch1;
    String-->Pchar: pch1:=str1;
    简言之,他们互相可以直接赋值!另外,pchar:='abc'; str1:='abc';这样赋值都是对的,从指针的角度去考虑应该不难理解。
         
      

  6.   

    pchar may be anything, but an empty string is not NULL, it's char(0).
      

  7.   

    pchar 是
    string 不是(它把'abc'复制到自己里面)
      

  8.   

    string to pchar PChar()
    pchar to string StrPCopy()
      

  9.   

    to  tlovexyj(菠萝菠萝蜜)
    请祥细说明,  string类型变量的赋值过程!谢谢!
      

  10.   

    pchar使用前必须配内存,string则不用。
      

  11.   

    两者都应该有内存的,但是string是没有结束符,而pchar是有的
    还有两者是可以相互赋制值的
      

  12.   

    两者都应该有内存的,但是string是没有结束符,而pchar是有的
    还有两者是可以相互赋值的
      

  13.   

     string可分为shortstring,anistring,widestring,默认下是anisstring,与pchar是一样的都是以null结尾的,而shorstring不是以null结尾的,以null结尾的字符串通常在调用win32api函数时做参数。
      

  14.   

    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);
    //要强制转花的
      

  15.   

    string是delphi内定义类型,pchar则是一个指针字符串
    ,pchar 好像后缀有#0。相互转换的话strpas(pchar);//pchar转成string
    strpcopy(pchar,string); 或直接pchar(string) //string转成pchar 
      

  16.   

    TO tsbob(不想笑)!
    你的回答不错的。不过,是2^8而不是2^16。
    不过,string类型的变量可以接受长达4G个字符串吗?
    我第一次听说的!
      

  17.   

    好像不是4G
    ShortString 255 characters
    AnsiString ~2^31 characters
    WideString ~2^30 characters
    如果你的编译器条件没有改变的话, String = AnsiString, 内存自管理的动态字符串
      

  18.   

    pchar是以NULL结尾的,这很重要。
      

  19.   

    补充一点string是delphi特有的,与其他语言不兼容,故在dll参数中一般用pchar
      

  20.   

    string它的赋值过程是怎么样的?
      

  21.   

    可以 这样转换,你可以查看f1,查以str开头的所有函数,你就可以找到你要的转换函数了!祝你成功!
      

  22.   

    string:他由char字符组成,其长度没有限制,同时与null结束的字符串相兼容!
    pchar:指向null结束的char字符串的指针,类似于C语言中的char*或lpstr类型!
      

  23.   

    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;