delphi函数move用法

var
s:String;
ps:pChar;
begin
s := '123456789';
ps := StrAlloc(9);
move(s,ps,length(s));
showMessage(ps);
showMessage(s);
showMessage(inttostr(StrBufSize(ps)));
StrDispose(ps);
end;
这样报错。。。。showMessage(s)出错,这个函数到底怎么用的?

首先,ShowMessage(s)没有出错。
其次,正确的代码如下:
s := '123456789';
ps := StrAlloc(Length(s)*sizeof(s[1])+1);
Move(PChar(s)^,ps^,Length(s)*sizeof(s[1])+1);
showMessage(ps);
showMessage(s);
showMessage(inttostr(StrBufSize(ps)));
StrDispose(ps);

原因如下:
s:String;
s中的每个字符所占的空间不一定是一个字节,在编译器的默认情况下,在32位平台上是两个字节。
Move是按字节来复制的,因此,在分配空间时,需要根据String中字符所占空间来计算。+1是为了存储字符串结束标志。所以有ps := StrAlloc(Length(s)*sizeof(s[1])+1);
另外,Move是传的地址,而String类型与PChar的类型又不一致,会导致编译器自动进行优化,结果就会出现问题。最简单的解决办法是进行强制类型转换,统一类型。PChar(S)是强制转换成PChar类型。ps^是取ps的首地址,同样,PChar(s)^也是取首地址。追问

谢谢你的回答,我还有点不明白.s[1]这样得出来是是char,肯定是1字节所以.sizeof(s[1])好像没意义,还有ps^这样不是解引用吗,怎么会得到地址呢

追答

s[1]肯定是Char,但不一定是1字节。
用以下代码验证一下:
ShowMessage(IntToStr(Sizeof(s[1])));
在Delphi 7中显示为1。在Delphi XE5中显示为2。所以,不要那么肯定。

ps是个PChar类型,即指向Char的指针,则ps^表示首字母,例如'123456789'中的 ‘1’,同时,也表示这个字符串的首地址。因此ps^传给move函数后,在代码中会取出ps所指向字符的地址,也就是整个字符串的首地址。你查一下move函数的源代码,代码如 syht2000所述,不再粘贴。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-26
delphi Move操作

var
s:string;
ps:Pchar;
b:pbyte;
len:integer;
begin
s:=edit1.Text; //字符串
ps:=pchar(s); //转成pchar类型,
len:=length(s);//取字符串长度,占用多少字节
getmem(b,len);//申请内存,pchar,pbyte在使用前都必须要申请内存,因为他们是指针.
move(ps^,b^,len);//这里 ps^意思是pchar指向内存数据的第一个字节地址,B^是表示申请内存的第一个字节地址,这样就可以一个一个字节的移到b里去了.
memo1.Text:=pchar(b);//显示.
freemem(b);
end;
有些人遇到的困惑是为什么 move(s,b,len)不行呢?同样我也遇到这样的困惑.
看了一样move的函数源码才明白.
procedure Move( const Source; var Dest; count : Integer );
{$IFDEF PUREPASCAL}
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);//取内存地址
D := PChar(@Dest);//取内存地址
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;
如果直接传入s,
S := PChar(@Source);//取内存地址\
就相当于取的字符串S地址的地址.
如果传入的是ps^
S := PChar(@Source);//取内存地址
就相当于取pchar 所指向字符串实际数据的地址.
第2个回答  2014-07-26
呵呵,你幸福了吧,在DELPHI中STRING和CHAR的数组是通用的,根本不用转换,直接用就行。例:VAR str:string[10];使用时,str就是字符串,而str[1就是数组。极其方便。
打字不易,如满意,望采纳。
第3个回答  2014-07-26
呵呵,你幸福了吧,在DELPHI中STRING和CHAR的数组是通用的,根本不用转换,直接用就行。例:VAR str:string[10];使用时,str就是字符串,而str[1就是数组。极其方便。
是否可以解决您的问题?
相似回答