基本的な質問なのか、ばかげた質問なのか、お詫び申し上げます。char*
との違いは何ですかLPSTR
。ここで、sizeof
両方とも私のコンパイラで4バイトを提供します。誰かが私を詳しく説明してもらえますか?ありがとう..
3 に答える
LPSTR
はWindowsタイプであり、コンパイルするプラットフォームに関係なく同じであることを意味します。文字列への長いポインタです。
セグメント化されたアーキテクチャ (新しいセレクター ベースのセグメント化されたメモリではなく、古い 64K セグメント) の時代には、小、小、中、大、および巨大なメモリ モデルがあったため、Windows の種類が常に同じであることが重要でした。ポインタの種類に関係なくchar *
。
したがって、基になる型が異なるさまざまなコンパイラに準拠した場合、windows.h
ヘッダー ファイルはLPSTR
それを補正するように定義します。
たとえば、Borland C には 16 ビットがchar *
あり、それLPSTR
を定義する必要があったかもしれませんfar char *
。char *
すでに long/far ポインターであったコンパイラーではLPSTR
、代わりにそれを使用していたでしょう。
現在、32 ビット以上のフラット モデルでは、このようなごまかしはおそらく実際には必要ありませんが、64 ビット コードと 32 ビット コードの間でのサンキングなどは依然として発生する可能性があります。それでも、そこに定義された型はまだ私たちと共にあり、今でも非常によく使われています。
基本的に、LP* ポインターは、16 ビット バージョンの Windows で 32 ビット ポインターを使用することを示していました。
ウィキブックスより
文字「LP」または接頭辞「lp」は「ロング ポインター」を表し、32 ビット マシンの通常のポインターとまったく同じです。LP データ オブジェクトは、ポインターとロング ポインターを区別する必要があった Windows 3.1 以降から引き継がれた単なるレガシ オブジェクトです。最新の 32 ビット システムでは、これらのプレフィックスを同じ意味で使用できます。
違いは時間の深さに埋もれています。LPSTR は「文字列への長いポインタ」の略です。32 ビット プロセッサが登場する前は、メモリの別のセグメント (メモリ内で遠く離れていると考えてください) にある可能性のあるメモリへのポインタには、保存するための余分なスペースが必要でした。
32 ビット (およびそれ以降) のプロセッサでは、これらはまったく同じものです。Microsoft は、歴史的な理由からのみ LPSTR を使用しています。