cmd:string;
MyStream:Tmemorystream;
调用  MyStream.Write(Cmd[1],Length(Cmd));时
为什么 不直接用  cmd 做参数

解决方案 »

  1.   

    string[0]是表示长度,所以要从1开始。
      

  2.   

    也可以得这样用: MyStream.Write(pinteger(integer(cmd))^,length(cmd));
      

  3.   

    Cmd[1] 是第一个字符的开头位置,pinteger(integer(cmd))^也是整个字符串的开头位置,楼上两位说的都是这个意思
      

  4.   

    Cmd是字符串,要访问Pchar就要用Cmd[1]
      

  5.   

    因为 @String <> @String[1]因为长字符串 String 变量实际是一个指针变量,它指向堆内存中的字符序列开始的位置(即String[1])。
      

  6.   

    string是一种特殊的类型
    我一般的理解就是把它看成是一个类似"对象"的东西.这种"对象"所占的空间里面,除了实际保存字符串的那些字节空间外,可能还有其他东西.
    实际保存字节的位置,不一定在这个"对象"开始的位置.  呵呵,不知道这样理解对不对. 下面是进一步分析:type
      TMyRecord1 = packed record
        a: Integer;
        b: string;
      end;  TMyRecord2 = packed record
        a: Integer;    
        b: array[0..255] of Char;
      end;这两个结构肯定是不一样的,从长度就可以看出来,
    SizeOf(TMyRecord1)  ----8个Byte.      integer占4个byte,string占4个
    SizeOf(TMyRecord2). ----260个Byte.    integer占4个byte,array占256个.对于TMyRecord2,内存是连续的,前4个字节,保存整型值.接着就是256个byte大小,保存实际的字符内容.
    但是TMyRecord1,里面的b这个结构成员,只是在里面记录一个地址.这个地址,是否就是b[1]的地址? 5楼的大哥说了,不是.那根据这个地址,怎么找到b[1]的地址?我也不知道.....呵呵.反正编译器知道怎么去找.  哪位老大知道,还望赐教!
    回到你的问题,
    MyStream.Write  这个方法,是将从第一个参数的地址那里开始,一直到第二个参数那么长的内存空间 的内容,写到流里面.
    如果传入string参数,很显然,正如上面的分析,这个地址,不是string[1]的地址....