Punteros basados (C++)
Específicos de Microsoft
La palabra clave de __based permite declarar punteros según los punteros (punteros que son desplazamientos de punteros existentes).
type __based( base ) declarator
Comentarios
Los punteros basados en direcciones de puntero son el único formulario de la palabra clave de __based válida en compilaciones de 32 bits o de 64 bits.Para el compilador de 32 bits de Microsoft C/C++, un puntero basado es un desplazamiento de 32 bits de una base de 32 bits del puntero.Una restricción similar se aplica a los entornos de 64 bits, donde es un desplazamiento un puntero de 64 bits de base 64 bits.
Un uso para punteros basados en punteros son los identificadores persistentes que contienen punteros.Una lista vinculada que consta de punteros según un puntero se puede guardar en el disco, después recargar a otra parte de la memoria, con punteros permanece válidos.Por ejemplo:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
El puntero vpBuffer se asigna la dirección de memoria asignada posteriormente en el programa.la lista vinculada se reubica en relación con el valor de vpBuffer.
[!NOTA]
Los identificadores de persistencia que contienen punteros también pueden realizarse mediante archivos asignados a memoria.
El desreferenciar un puntero basado, base se debe especificar explícitamente o saber implícitamente con la declaración.
Por compatibilidad con versiones anteriores, _based es un sinónimo de __based.
Ejemplo
El código siguiente muestra cómo cambiar un puntero basado cambiando su 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;
}