使用delphi多年,前些天忽然遇到不會(huì)string轉(zhuǎn)pbyte,很是失落,此時(shí)對(duì)于編程基本功的重要性深有體會(huì).這其中用到MOVE函數(shù).
搞了好一會(huì)才搞明白其用法.所以想貼出來(lái)幫助需要幫助的人.
var
s:string;
ps:Pchar;
b:pbyte;
len:integer;
begin
s:=edit1.Text; //字符串
ps:=pchar(s); //轉(zhuǎn)成pchar類型,
len:=length(s);//取字符串長(zhǎng)度,占用多少字節(jié)
getmem(b,len);//申請(qǐng)內(nèi)存,pchar,pbyte在使用前都必須要申請(qǐng)內(nèi)存,因?yàn)樗麄兪侵羔?
move(ps^,b^,len);//這里 ps^意思是pchar指向內(nèi)存數(shù)據(jù)的第一個(gè)字節(jié)地址,B^是表示申請(qǐng)內(nèi)存的第一個(gè)字節(jié)地址,這樣就可以一個(gè)一個(gè)字節(jié)的移到b里去了.
memo1.Text:=pchar(b);//顯示.
freemem(b);
end;
有些人遇到的困惑是為什么 move(s,b,len)不行呢?同樣我也遇到這樣的困惑.
看了一樣move的函數(shù)源碼才明白.
procedure Move( const Source; var Dest; count : Integer );
{$IFDEF PUREPASCAL}
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);//取內(nèi)存地址
D := PChar(@Dest);//取內(nèi)存地址
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);//取內(nèi)存地址\
就相當(dāng)于取的字符串S地址的地址.
如果傳入的是ps^
S := PChar(@Source);//取內(nèi)存地址
就相當(dāng)于取pchar 所指向字符串實(shí)際數(shù)據(jù)的地址.
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。