delphi char數組、string和Pchar的相互轉換

由於要調用windows的api或者給vc++寫接口,不少地方都要用到pchar,如今將char數組、string和pchar之間的相互轉換都列出來,都是網上找的資料,我總結一下,先直接上代碼,再講原理。c++

 

1.string轉換成pchar程序員

   可使用pchar進行強制類型轉換,也可使用StrPCopy函數windows

var s:string; p,p1:PChar; begin s:='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函數轉換一下api

var
s,s1,s2:string;
p:PChar;
begin
s:='Hello Delphi';
p:=PChar(s);
ShowMessage(p);
s1:=p;
ShowMessage(s1);
s2:=StrPas(p);
ShowMessage(s2);
end;數組

3.char數組轉換成string
   使用StrPas函數獲取數組的首地址
var
c:array [0..11] of Char;
s:string;
begin
c[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函數spa

var
s:string;
c:array of Char;
i:Integer;
begin
s:='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) do
begin
ShowMessage(string(c[i]))
end;
end;.net

5.char數組轉pchar指針

var
c:array [0..11] of Char;
p:PChar;
begin
c:='Hello Delphi';
//p:=@c[0];
p:=PChar(@c[0]);
ShowMessage(StrPas(p));
end;code

6.pchar轉char數組
使用move或者CopyMemory函數

var
s:string;
p:PChar;
c:array of Char;
i:Integer;
begin
s:='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) do
begin
ShowMessage(string(c[i]))
end;
end;


如今講講char數組、pchar和string

string和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


var
p:PChar;
s:string;
begin
s:='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
正確使用以下:

var
p:PChar;
s:string;
begin
s:='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數組
var
s:string;
c:array of Char;
i:Integer;
begin
s:='Hello Delphi';
SetLength(c,Length(s));
StrPCopy(@c[0],s);
for i:=Low(c) to High(c) do
begin
ShowMessage(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

正確代碼以下:

var s:string; c:array of Char; i:Integer;begin s:='Hello Delphi'; SetLength(c,Length(s)+1); StrPCopy(@c[0],s); for i:=Low(c) to High(c) do begin ShowMessage(string(c[i])) end;end;使用strpcopy函數的時候必定要保證目的pchar的長度至少是源字符串的長度+1--------------------- 版權聲明:本文爲CSDN博主「kunlun122」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/kunlun122/article/details/13773075

相關文章
相關標籤/搜索