掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
PCharの扱いに関して (ID:38981)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Delphi2009とか最近のDelphiのStringはよく分かりません。 const で指定した物や、コード中で直接設定した文字列は PChar型に渡した場合、勝手に変換されます。 例にあるような procedure Proc(Name :PChar); という手続きの場合 Proc('Name') と書くこともできます。 Const Name = 'Name'; --- begin Proc(Name) end; は、Constしてるだけですので上と等価です。 また、PChar はポインターなので、長さは関係ないです。 PCharの示す先に何かがあって「不都合が起こらない限り」アクセスできます。 ただし、文字列として扱われる場合 #0 があれば、そこで終わります。 また、delphiのstringは255文字で終わりません。 かつての255文字制限の String は ShortString として残っています。 var s:string; p:PChar; begin s:= 'ABCDE'#0'FGHIJKLMN'; p:= PChar(s); s:= StrPas(p); Memo1.Lines.Add(s); end; 出力 ABCDE --- var p:PChar; s:string; begin s:='ABCDE'; // 勝手にメモリが確保される。 p:=@s[1]; // PChar は Stringのアドレスを参照している inc(p); // 1つ進める p^:='X'; // p は s を参照しているので s の2番目が変わる Memo1.Lines.Add(s); //上と等価 p:= PChar(s); inc(p); p^:='Z'; Memo1.Lines.Add(s); end; 出力 AXCDE AZCDE Stringなどを参照することなく、PCharだけで文字列を扱おうとすれば、StrAllocまたはGetMemしなければ、文字列として使えません。 stringをPCharにキャストした場合、そのアドレスが参照されているだけで、自身以外のメモリは確保されません。 その辺が String と違う所です。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.