Puntatori base (C++)
Specifici di Microsoft
__based la parola chiave consente di dichiarare i puntatori basati sui puntatori (puntatori che sono offset dai puntatori esistenti.
type __based( base ) declarator
Note
I puntatori in base agli indirizzi del puntatore sono l'unico del form __based parola chiave valida in 32 bit o compilazioni a 64 bit.Per il compilatore a 32 bit C/C++ Microsoft, un puntatore basato è un offset pari a 32 bit in base al puntatore a 32 bit.Contiene simili di una restrizione per gli ambienti a 64 bit, in cui un puntatore basato è un offset pari a 64 bit in base a 64 bit.
Un utilizzo dei puntatori basati sui puntatori riguarda gli identificatori persistente che contengono puntatori.Un elenco collegato costituito dai puntatori in base a un puntatore può essere salvato su disco, pertanto essere ricaricatoe a un altro punto della memoria, con i puntatori che rimangono validi.Di seguito è riportato un esempio:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
il puntatore vpBuffer viene assegnato l'indirizzo di memoria allocato in un secondo momento successivo durante il programma.L'elenco collegato quest'ultimo viene riassegnato al valore di vpBuffer.
[!NOTA]
Mantenere gli identificatori che contengono puntatori può essere eseguito utilizzando file mappati alla memoria.
Nella dereferenziazione di un puntatore basato su, la base deve essere specificata in modo esplicito o implicito nota nella dichiarazione.
Per garantire la compatibilità con le versioni precedenti, _based è sinonimo di __based.
Esempio
Il codice seguente viene illustrato modificare un puntatore basato modificando il relativo base.
// 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;
}