interior_ptr (C++/CLI)interior_ptr (C++/CLI)

"内部ポインター" は、参照型の内部へのポインターを宣言しますが、オブジェクト自体へのポインターは宣言しません。An interior pointer declares a pointer to inside a reference type, but not to the object itself. 内部ポインターは、参照ハンドル、値の型、ボックス化された型のハンドル、マネージ型のメンバーまたは、マネージ配列の要素を指すことができます。An interior pointer can point to a reference handle, value type, boxed type handle, member of a managed type, or to an element of a managed array.

すべてのランタイムAll Runtimes

(この言語機能にはランタイムに適用される特記事項がありません。)(There are no remarks for this language feature that apply to all runtimes.)

Windows ランタイムWindows Runtime

(この言語機能には Windows ランタイムのみに適用される特記事項がありません。)(There are no remarks for this language feature that apply to only the Windows Runtime.)

要件Requirements

コンパイラ オプション: /ZWCompiler option: /ZW

共通言語ランタイムCommon Language Runtime

次の構文例では、内部ポインターを示します。The following syntax example demonstrates an interior pointer.

構文Syntax

cli::interior_ptr<cv_qualifier type> var = &initializer;

パラメーターParameters

cv_qualifiercv_qualifier
const または volatile 修飾子。const or volatile qualifiers.

typetype
initializer の型。The type of initializer.

varvar
interior_ptr 変数の名前。The name of the interior_ptr variable.

initializerinitializer
参照型のメンバー、マネージ配列の要素、またはネイティブ ポインターに割り当てることができるその他のオブジェクト。A member of a reference type, element of a managed array, or any other object that you can assign to a native pointer.

解説Remarks

ガベージ コレクション コレクターによるオブジェクトのインスタンスの移動によってマネージ ヒープ上の位置が変わるため、ネイティブ ポインターでは項目を追跡することはできません。A native pointer is not able to track an item as its location changes on the managed heap, which results from the garbage collector moving instances of an object. ポインターがインスタンスを正しく参照するように、ランタイムで、新しく配置されたオブジェクトにポインターを更新する必要があります。In order for a pointer to correctly refer to the instance, the runtime needs to update the pointer to the newly positioned object.

interior_ptr は、ネイティブ ポインターの機能のスーパーセットを表します。An interior_ptr represents a superset of the functionality of a native pointer. そのため、ネイティブ ポインターに割り当てることができるものは、すべて interior_ptr にも割り当てることができます。Therefore, anything that can be assigned to a native pointer can also be assigned to an interior_ptr. 内部ポインターは、比較演算やポインター演算など、ネイティブ ポインターと同じ一連の操作を実行できます。An interior pointer is permitted to perform the same set of operations as native pointers, including comparison and pointer arithmetic.

内部ポインターは、スタックでのみ宣言できます。An interior pointer can only be declared on the stack. クラスのメンバーとして、内部ポインターを宣言することはできません。An interior pointer cannot be declared as a member of a class.

内部ポインターはスタックにのみ存在するため、内部ポインターのアドレスを取得すると、アンマネージ ポインターが発生します。Since interior pointers exist only on the stack, taking the address of an interior pointer yields an unmanaged pointer.

interior_ptr にはbool への暗黙的な変換があり、これにより、条件付きステートメントで使用することができます。interior_ptr has an implicit conversion to bool, which allows for its use in conditional statements.

ガベージ コレクション ヒープ上に移動できないオブジェクトを指す内部ポインターを宣言する方法については、pin_ptr を参照してください。For information on how to declare an interior pointer that points into an object that cannot be moved on the garbage-collected heap, see pin_ptr.

interior_ptr は cli 名前空間に存在します。interior_ptr is in the cli namespace. 詳細については、「Platform, default, and cli Namespaces (プラットフォーム、既定、および cli 名前空間)」を参照してください。See Platform, default, and cli Namespaces for more information.

内部ポインターの詳細については、以下を参照してください。For more information on interior pointers, see

要件Requirements

コンパイラ オプション: /clrCompiler option: /clr

使用例Examples

次の例では、参照型への内部ポインターを宣言して使用する方法を示します。The following sample shows how to declare and use an interior pointer into a reference type.

// interior_ptr.cpp
// compile with: /clr
using namespace System;

ref class MyClass {
public:
   int data;
};

int main() {
   MyClass ^ h_MyClass = gcnew MyClass;
   h_MyClass->data = 1;
   Console::WriteLine(h_MyClass->data);

   interior_ptr<int> p = &(h_MyClass->data);
   *p = 2;
   Console::WriteLine(h_MyClass->data);

   // alternatively
   interior_ptr<MyClass ^> p2 = &h_MyClass;
   (*p2)->data = 3;
   Console::WriteLine((*p2)->data);
}
1
2
3

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP