回答:
「ネイティブ(プラットフォーム固有)サイズの整数」です。内部的にはとして表されますvoid*
が、整数として公開されます。アンマネージポインターを格納する必要があり、unsafe
コードを使用したくない場合はいつでも使用できます。IntPtr.Zero
は効果的ですNULL
(nullポインター)。
IntPtr
整数(数学的整数など)とポインタ(ポインタなど)であるため、これは完全に意味があります。このInt
部分はint型とはほとんど関係がありません。これは概念であり、特定の型ではありません。公平であるとはいえ、CLI仕様がそれについて言う唯一のことは、それが実際に「整数、ネイティブサイズ」であるということです。まあ:)
これは、ネイティブまたは安全でないコードで使用されるメモリアドレスを格納するのに十分な大きさの値型ですが、安全なマネージコードでメモリアドレスとして直接使用することはできません。
IntPtr.Size
それぞれ4バイトまたは8バイトになるため、32ビットプロセスで実行しているか64ビットプロセスで実行しているかを確認するために使用できます。
IntPtr
アーキテクチャに関係なく32ビットのハンドルを表すためにも使用されます(ただしSize
、この場合は8と表示されます)。CLI仕様では、これが「ネイティブサイズ」の整数であることのみが記載されていますが、実際にはあまり意味がありません。
次に例を示します。
高速カメラとインターフェースするC#プログラムを書いています。カメラには、画像を取得してコンピューターのメモリに自動的に読み込む独自のドライバーがあります。
したがって、最新の画像をプログラムに取り込んで作業する準備ができたら、カメラドライバーは、画像がどこに物理メモリに保存されているかを示すIntPtrを提供するので、時間やリソースを無駄にして別の画像を作成する必要がありません。すでにメモリにある画像を保存するためのメモリブロック。IntPtrは、画像がすでにどこにあるかを表示するだけです。
AN のIntPtrである整数と同じサイズであるポインタ。
IntPtrを使用して、ポインター値を非ポインター型に格納できます。ポインタを使用するとエラーが発生しやすくなるため、この機能は.NETで重要です。ポインター値を「安全な」データ型で格納できるようにすることで、安全でないコードセグメント間の配管を、より安全な高レベルのコードで実装できます。また、ポインターを直接サポートしていない.NET言語でも実装できます。
IntPtrのサイズはプラットフォーム固有ですが、システムが自動的に正しいサイズを使用するため、この詳細を考慮する必要はほとんどありません。
「IntPtr」という名前は紛らわしい-のようなものHandle
がより適切であったかもしれない。私の最初の推測は、 "IntPtr"は整数へのポインターであったということでした。IntPtrのMSDNドキュメントは、名前の意味についての洞察をこれまで提供することなく、いくぶん不可解な詳細を説明しています。
an IntPtr
は、2つの制限があるポインターです。
言い換えれば、an IntPtr
はaと同じですが、void*
基本的なポインタ演算に使用できる(ただし、使用してはならない)追加機能があります。
を逆参照するにはIntPtr
、それをtrueポインター(「安全でない」コンテキストでのみ実行できる操作)にキャストするか、InteropServices.Marshal
クラスによって提供されるようなヘルパールーチンに渡すことができます。Marshal
クラスを使用すると、明示的な「安全でない」コンテキストにいる必要がないため、安全であるかのように見えます。ただし、ポインターの使用に固有のクラッシュのリスクは排除されません。
ポインターとは何ですか?
すべての言語で、ポインターはメモリアドレスを格納する変数の一種であり、ポインターが指しているアドレスまたはポインターが指しているアドレスの値を通知するように要求できます。
ポインタは、一種のブックマークと考えることができます。例外として、本のページにすばやくジャンプするために使用される代わりに、メモリのブロックを追跡またはマップするためにポインタが使用されます。
プログラムのメモリを65535バイトの1つの大きな配列のように正確に想像してください。
ポインタが素直に指す
ポインタはそれぞれ1つのメモリアドレスを記憶しているため、メモリ内の単一のアドレスをそれぞれポイントします。
グループとして、ポインターはメモリアドレスを記憶および呼び出し、すべてのコマンドと悪心に従います。
あなたは彼らの王です。
C#のポインター
特にC#では、ポインターは0〜65534のメモリアドレスを格納する整変数です。
また、C#に固有のポインターはint型であるため、署名されています。
ただし、負の番号のアドレスを使用することはできません。また、65534を超えるアドレスにアクセスすることもできません。アクセスしようとすると、System.AccessViolationExceptionがスローされます。
MyPointerと呼ばれるポインターは、次のように宣言されます。
int * MyPointer;
C#のポインターはintですが、C#のメモリアドレスは0から始まり、65534まで拡張されます。
とがったものは特別な注意を払って処理する必要があります
安全でないという言葉はあなたを怖がらせることを目的としていますが、それには非常に正当な理由があります。ポインタはとがったものであり、たとえば剣、斧、ポインタなどのとがったものは特別な注意を払って扱う必要があります。
ポインターは、プログラマーにシステムの厳密な制御を提供します。したがって、間違いはより深刻な結果をもたらす可能性があります。
ポインターを使用するには、プログラムのプロパティで安全でないコードを有効にする必要があり、ポインターは、安全でないとマークされたメソッドまたはブロックでのみ使用する必要があります。
安全でないブロックの例
unsafe
{
// Place code carefully and responsibly here.
}
ポインタの使い方
変数またはオブジェクトが宣言またはインスタンス化されると、それらはメモリに格納されます。
int *MyPointer;
MyPointer = &MyVariable;
アドレスがポインターに割り当てられると、以下が適用されます。
MyPointer = &MyVariable; // Set MyPointer to point at MyVariable
"MyPointer is pointing at " + *MyPointer;
ポインタはメモリアドレスを保持する変数であるため、このメモリアドレスはポインタ変数に格納できます。
慎重かつ責任を持って使用されているポインターの例
public unsafe void PointerTest()
{
int x = 100; // Create a variable named x
int *MyPointer = &x; // Store the address of variable named x into the pointer named MyPointer
textBox1.Text = ((int)MyPointer).ToString(); // Displays the memory address stored in pointer named MyPointer
textBox2.Text = (*MyPointer).ToString(); // Displays the value of the variable named x via the pointer named MyPointer.
}
ポインタの型がintであることに注意してください。これは、C#がメモリアドレスを整数(int)として解釈するためです。
なぜuintではなくintなのですか?
正当な理由はありません。
なぜポインタを使用するのですか?
ポインタはとても楽しいです。コンピューターの多くがメモリによって制御されているため、ポインターはプログラマーにプログラムのメモリの制御を強化します。
メモリの監視。
ポインタを使用してメモリのブロックを読み取り、ポイントされている値が時間とともにどのように変化するかを監視します。
これらの値を責任を持って変更し、変更がコンピューターに与える影響を追跡します。
65534
ポインター範囲としては非常に間違っているようです。参照を提供する必要があります。
System.IntPtr
です。最後に更新された回答を見てSystem.IntPtr
、C#の安全でないポインタに何がどのように関連しているかを説明してください。
MSDNは次のように述べています。
IntPtr型は、サイズがプラットフォーム固有の整数になるように設計されています。つまり、このタイプのインスタンスは、32ビットのハードウェアおよびオペレーティングシステムでは32ビットであり、64ビットのハードウェアおよびオペレーティングシステムでは64ビットであることが想定されています。
IntPtr型は、ポインターをサポートする言語で使用でき、ポインターをサポートする言語とサポートしない言語間でデータを参照するための一般的な手段として使用できます。
IntPtrオブジェクトは、ハンドルを保持するためにも使用できます。たとえば、IntPtrのインスタンスは、ファイルハンドルを保持するためにSystem.IO.FileStreamクラスで広く使用されています。
IntPtrタイプはCLSに準拠していますが、UIntPtrタイプは準拠していません。共通言語ランタイムではIntPtr型のみが使用されます。UIntPtr型は、主にIntPtr型とのアーキテクチャ上の対称性を維持するために提供されています。
http://msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
さて、これはを扱っているMSDNページですIntPtr
。
最初の行は次のとおりです。
ポインターまたはハンドルを表すために使用されるプラットフォーム固有の型。
ポインターまたはハンドルが何であるかに関して、ページは次のように続きます:
IntPtr型は、ポインターをサポートする言語で使用でき、ポインターをサポートする言語とサポートしない言語間でデータを参照するための一般的な手段として使用できます。
IntPtrオブジェクトは、ハンドルを保持するためにも使用できます。たとえば、IntPtrのインスタンスは、ファイルハンドルを保持するためにSystem.IO.FileStreamクラスで広く使用されています。
ポインタは、関心のあるデータを保持するメモリ領域への参照です。
ハンドルはオブジェクトの識別子にすることができ、両側がそのオブジェクトにアクセスする必要があるときにメソッド/クラス間で渡されます。