delphi char数组、string和Pchar的相互转换
生活随笔
收集整理的這篇文章主要介紹了
delphi char数组、string和Pchar的相互转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
delphi char數組、string和Pchar的相互轉換
因為要調用windows的api或者給vc++寫接口,很多地方都要用到pchar,現在將char數組、string和pchar之間的相互轉換都列出來,都是網上找的資料,我總結一下,先直接上代碼,再講原理。1.string轉換成pchar可以使用pchar進行強制類型轉換,也可以使用StrPCopy函數復制代碼
vars:string;p,p1:PChar;
begins:='Hello Delphi';p:=PChar(s);ShowMessage(p);p1:=StrAlloc(Length(s)+1);StrPCopy(p1,s);ShowMessage(p1);StrDispose(p1);
end;
復制代碼2.pchar轉換成string pchar可以直接當string用,也可以用strpas函數轉換一下復制代碼
vars,s1,s2:string;p:PChar;
begins:='Hello Delphi';p:=PChar(s);ShowMessage(p);s1:=p;ShowMessage(s1);s2:=StrPas(p);ShowMessage(s2);
end;
復制代碼3.char數組轉換成string使用StrPas函數獲取數組的首地址復制代碼
varc:array [0..11] of Char;s:string;
beginc[0]:='H';c[1]:='e';c[2]:='l';c[3]:='l';c[4]:='o';c[5]:=' ';c[6]:='D';c[7]:='e';c[8]:='l';c[9]:='p';c[10]:='h';c[11]:='i';s:=StrPas(@c[0]);ShowMessage(s);
end;
復制代碼4.string轉char數組使用move或者copymemory函數復制代碼
vars:string;c:array of Char;i:Integer;
begins:='Hello Delphi';SetLength(c,Length(s));//Move(s[1],c[0],Length(s));//move和CopyMemory都行CopyMemory(@c[0],PChar(s),Length(s));for i:=Low(c) to High(c) dobeginShowMessage(string(c[i]))end;
end;
復制代碼5.char數組轉pchar復制代碼
varc:array [0..11] of Char;p:PChar;
beginc:='Hello Delphi';//p:=@c[0];p:=PChar(@c[0]);ShowMessage(StrPas(p));
end;
復制代碼6.pchar轉char數組使用move或者CopyMemory函數復制代碼
vars:string;p:PChar;c:array of Char;i:Integer;
begins:='Hello Delphi';p:=PChar(s);SetLength(c,Length(s));//Move(p^,c[0],Length(s));//move和CopyMemory都行CopyMemory(@c[0],p,Length(s));;for i:=Low(c) to High(c) dobeginShowMessage(string(c[i]))end;
end;
復制代碼現在講講char數組、pchar和stringstring和Char數組都是一塊內存,其中存放連續的字符. string保存具體字符的內存對用戶是透明的, 由Delphi管理它的分配, 復制和釋放, 用戶不能干預(其實也可以, 不過是通過非法途徑). Char數組就不必說了吧?PChar是一個指針, 它的大小只有32位. 定義時由Delphi自動填0. 要將PChar作為字符串使用的話必須自己分配內存用完必須自己釋放. PChar型字符串由#0表示字符串結尾Delphi所提供的相關PChar字符串的操作都是判斷#0來決定字符串的結尾的。
因為PChar是指針,所以它能指向任何地方(也就是說它不一定非要指向字符串不可).把一個String賦值給PChar只是將String中保存具體字符串的內存的地址給PChar變量. 當然也可以把Char數組第一個元素的地址給PChar.至于 哪個占用內存小, Char數組<PChar(指分配過字符串的)<string(除了具體字符串外還包含字符串長度)
如果空字符串那么PChar<String<array [0..n] of Char
從速度來說毫無疑問string最慢, 例如:
作為參數傳遞(非var調用時)給過程時string將整個字串的副本傳遞過去, PChar將指針本身的副本傳遞過去(32位), Char數組和PChar一樣, 傳遞的是第一個元素的地址副本.不過就靈活性來說string最高, 而且Delphi支持的函數最多. 另外可以將String作為Buffer使用(因為它當中可以包含字符0).注:因為string和char數組都是連續的,所以指向string的首地址的指針為@s[1],指向char數組的首地址的指針為@c[0]。pchar是以#0結尾的,所以很多關于pchar的函數的使用的時候要注意,如使用StrAlloc函數給pchar分配內存的時候和使用StrPCopy函數的時候7.使用StrAlloc函數將一個string轉換給pchar復制代碼
varp:PChar;s:string;
begins:='ABCDEF';p:=StrAlloc(Length(s));Move(s[1],p^,Length(s));ShowMessage(StrPas(p));StrDispose(p);
end;
復制代碼執行以上代碼的時候,字符串后面有亂碼,查看delphi幫助里面關于StrAlloc函數delphi的幫助如下:StrAlloc allocates a buffer for a null-terminated string with a maximum length ofSize - 1 (1 byte must be reserved for the termination character). StrAlloc函數給pchar指向的字符串分配的實力內存為size-1個字節,所以我們要多分配一個字節的內存,用來存pchar的結束標志#0正確使用如下:復制代碼
varp:PChar;s:string;
begins:='ABCDEF';p:=StrAlloc(Length(s)+1);Move(s[1],p^,Length(s)+1);//將s的內容按照字節復制到p里面//Move(s[1],p^,Length(s)); //執行這句會出現亂碼ShowMessage(StrPas(p));StrDispose(p);
end;
復制代碼8.使用StrPCopy將string轉換成char數組復制代碼
vars:string;c:array of Char;i:Integer;
begins:='Hello Delphi';SetLength(c,Length(s));StrPCopy(@c[0],s);for i:=Low(c) to High(c) dobeginShowMessage(string(c[i]))end;
end;
復制代碼以上代碼執行的時候會報錯,查看delphi幫助才知道,strpcopy函數不做長度檢查,需要程序員自己控制。delphi幫助如下:StrPCopy copies Source into a null-terminated string Dest. It returns a pointer to Dest.
StrPCopy does not perform any length checking.
The destination buffer must have room for at least Length(Source)+1 characters正確代碼如下:復制代碼
vars:string;c:array of Char;i:Integer;
begins:='Hello Delphi';SetLength(c,Length(s)+1);StrPCopy(@c[0],s);for i:=Low(c) to High(c) dobeginShowMessage(string(c[i]))end;
end;
復制代碼
使用strpcopy函數的時候一定要保證目的pchar的長度至少是源字符串的長度+1
總結
以上是生活随笔為你收集整理的delphi char数组、string和Pchar的相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习(七十二)英寸 厘米 像素 d
- 下一篇: flask中for循环