ベース ポインター (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
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示