ベース ポインター (C++)

__based キーワードを使用すると、ポインター ベースのポインター (既存のポインターからのオフセットであるポインター) を宣言できます。 __based キーワードは Microsoft 固有です。

構文

type __based( base ) declarator

解説

ポインター アドレスに基づくポインターは、32 ビットまたは 64 ビット コンパイルで有効な __based キーワードの唯一の形式です。 Microsoft の 32 ビット C/C++ コンパイラでは、based ポインターは 32 ビットのポインター ベースからの 32 ビットのオフセットになります。 同様の制限は 64 ビット環境にもあり、based ポインターは 64 ビット ベースからの 64 ビット オフセットになります。

ポインターに基づいたポインターの使用方法の 1 つは、ポインターを含む永続的な識別子での使用です。 ポインターに基づくポインターで構成されるリンク リストをディスクに保存でき、メモリ内の別の場所に再読み込みしても、ポインターは有効なままです。 次に例を示します。

// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
   void __based( vpBuffer ) *vpData;
   struct llist_t __based( vpBuffer ) *llNext;
};

ポインター vpBuffer には、プログラムの後の段階で割り当てられるメモリ アドレスが代入されます。 リンク リストは vpBuffer の値を基準として再配置されます。

Note

ポインターを含む識別子の永続化は、メモリ マップト ファイルを使用して実行することもできます。

based ポインターを逆参照する場合、ベースは、明示的に指定されているか、または宣言によって暗黙的に認識されている必要があります。

以前のバージョンとの互換性を確保するため、_based は、コンパイラ オプション /Za (言語拡張機能の無効化) が指定されていない限り、__based の同意語です。

次のコードは、ベースの変更による based ポインターの変更を示します。

// based_pointers2.cpp
// compile with: /EHsc
#include <iostream>

int a1[] = { 1,2,3 };
int a2[] = { 10,11,12 };
int *pBased;

typedef int __based(pBased) * pBasedPtr;

using namespace std;
int main() {
   pBased = &a1[0];
   pBasedPtr pb = 0;

   cout << *pb << endl;
   cout << *(pb+1) << endl;

   pBased = &a2[0];

   cout << *pb << endl;
   cout << *(pb+1) << endl;
}
1
2
10
11

関連項目

キーワード
alloc_text