string = AnsiString = 長字符串,理論上長度不受限制,但其實受限於最大尋址範圍2的32次方=4G字節;html
變量Str名字是一個指針,指向位於堆內存的字符序列,字符序列起始於@Str[1],@Str[1]偏移負16個字節的空間存儲着字串長度、引用計數等信息。字符序列以NULL結束。數組
string[n] = ShortString = 短字符串,最多容納255個字符,實際長度是字符長度+1,是Delphi的簡單類型;ide
Str[0]存儲着字符的個數,第一個字符從Str[1]開始存放,不以NULL結束。post
只要理解這一理論,轉string應該就不成問題了!測試
把buf內容賦給ShortStringui
var buf: array[0..100] of byte; str: string[32];//僅僅開闢了一個32個空間的內存,因爲第1位沒有用setlength初始化,致使長度不定 i : Integer; begin //若是在此處就對str進行賦值,str[0]位就有計數了,若是在使用以前沒有對其進行使用,用SetLength進行賦值 for i := 50 to 81 do buf[i] := ord('A') + i -50;//測試數據 SetLength(str, 32);//設置str[0]=32; Move(buf[50], str[1], 32);//內存複製 ShowMessage (str); end;
在這裏從新認識一下SetLength,SetLength有2個功能:url
對Short string類型進行設置長度(專門針對其第1位進行設置)spa
對動態數組進行設置指針
把buf內容賦給AnsiString code
string與string[]不同,string是一個動態數組,尚未分配空間,而string[]已經預分配了空間,只不過str[0]處沒賦初值,這時若是用Move的話會把Byte數組中的數據拷貝到string空間中,而string這時尚未分配內存,確定會形成AV錯誤)
var buf: array[0..100] of byte; str: string; i : Integer; begin for i := 50 to 81 do buf[i] := ord('A') + i -50; SetLength(str, 32); Move(buf[50], str[1], 32);//注意,這裏是從str[1]開始複製的 ShowMessage (str); end;
var buf: array[0..100] of byte; str: string; begin str:='abcdefg'; Move( str[1],buf[0], 32);//注意,這裏是從str[1]開始複製的 ShowMessageFmt('$%.2d, $%.2d, $%.2d, $%.2d', [buf[3], buf[2], buf[1], buf[0]]); end;
郵箱:wwwlllll@126.com
本文申明:本文版權歸做者和博客園共有,歡迎轉載,轉載請註明出處.