var
   P2:PChar;
   S1:String;
begin
   S1:='Test...';
   P2:=StrNew(PChar(S1));    。。(1)
   ....
end;请问这两条语句有何区别?
          P2:=StrNew(PChar(S1));与P2:=PChar(S1);如果将语句(1)换成P2:=PChar(S1);可以吗?

解决方案 »

  1.   

    P2:=StrNew(PChar(S1));开辟一块新内存,拷贝S1,P2指向新内存地址;
    P2:=PChar(S1); P2指向S1[1]的地址,即P2 := @S1[1]
      

  2.   

    P2:=StrNew(PChar(S1));在堆栈上分配一个字符串
    P2:=PChar(S1); P2指向S1[1]的地址,即P2 := @S1[1]
      

  3.   

    //   kmzym() ( ) 信誉:98  2003-11-20 17:22:29  得分:0 
    //   P2:=StrNew(PChar(S1));开辟一块新内存,拷贝S1,P2指向新内存地址;
    //   P2:=PChar(S1); P2指向S1[1]的地址,即P2 := @S1[1]如果对P2的内容进行改变,是否S1的内容也会改变?  
     
      

  4.   

    to caike(ck) 
    P2:=StrNew(PChar(S1));P2指向的是复制S1内容的内存地址,修改P2,S1的内容不会改变。
    P2:=PChar(S1); P2和S1用的是同一内存地址,修改P2,S1的内容也改变了。
      

  5.   

    一般来说,在传递参数的时候,如果需要直接修改原地址的值,用P2:=PChar(S1)比较方便,否则你还要重新把P2的值拷贝回去.我主要都是在引用参数的时候使用.
      

  6.   

    to kmzym() :我后来给P2赋过值,但S1的内容并没有改变呀。   s1:='abcde';
       P2:=PChar(s1);
       P2:='12345'
    这时,是否S1的值也会变成'12345',但我在程序中运行这段代码后,S1的值并没有改变呀1
      

  7.   

    在delphi中,直接给Pchar类型P2赋值,P2将指向内存中一块包含一个空字符结尾的副本区域。P2:='12345'实际上等价于 
    const Tempstring: array[0..6]of char = '12345'#0;
    P2 := @Tempstring;
    P2已经不是原来地址@S1[1]了,所以S1内容没有变。
      

  8.   

    to caike(ck) 你把负值方法改为Move('12345',P2^,5);看看结果就清楚了 
      

  9.   

    pchar=char *; //指针
    string=AnsiString;//类似于BCB的一个类,只不过没得属性和方法,只有operate
      

  10.   

    严格的说,string是Delphi编译器扶持的一种数据类型,不是类,,呵呵
    不过,,,每申明一个string,就有不同的实例,而不是指针
      

  11.   

    to kmzym() :
       我按您提示的方法去试了一下,但报了错呀。
        ....
        MOVE('12345',p2^,5);
        ...
       提示错误:Access violation at address 004028CB in module 'aa.exe'.Write of address 00452464.
       这样好像通不过呀。
      

  12.   

    这个错误我也碰到了,怀疑是delphi的bug.

    var
     S1: string;
     P2: Pchar;
    begin
      S1 := 'abcde';
      SetLength(S1,6);
      P2 := Pchar(S1);
      Move('12345',P2^,5);
      Caption := S1;
    end;或者
    var
     S1: string;
     P2: Pchar;
    begin
      S1 := 'abcde';
      P2 := @S1[1];
      Move('12345',P2^,5);
      Caption := S1;
    end;
    就不会出错,没有仔细研究,不知道是什么原因。
      

  13.   

    var
     S1: string;
     P2: Pchar;
    begin
      S1 := 'abcde';
      SetLength(S1,6);
      P2 := Pchar(S1);
      Move('12345',P2^,5);
      Caption := S1;
    end;在这段程序中,如果SetLength(s1,6)这里长度是6的话,那么在move后,s1会多出一个字符,如果是5的话,s1就为12345,不会多出字符。
    但这是为什么呢?书上讲到s1:='abcde'这样赋值,就已经给s1确定了长度呀,为何还要用setlength()再将分配长度?第二个程序好像能理解,因为赋给p2的是s1字符串的首地址,执行move操作,p2的值自动加1,连续加5次,给p2所指向的内存赋值为1,2,3,4,5。由于p2是指向s1的内存空间,所以s1的值也就发生改变。但第一种方法如何理解?还请高手指点!
      

  14.   

    delphi默认的string类型是AnsiString,长度是自动分配的。
    前面运行到Move('12345',P2^,5)的时候报错,怀疑是S1的自动设置的指针或分配的内存有问题,所以用setlength重新设置S1。
    至于长度,可以忽略。