Punteros con base (C++)

La palabra clave __based permite declarar punteros basados en punteros (punteros que son desplazamientos de punteros existentes). La palabra clave __based es específica de Microsoft.

Sintaxis

type __based( base ) declarator

Comentarios

Los punteros basados en direcciones de puntero son la única forma de la palabra clave __based válida en compilaciones de 32 y 64 bits. Para el compilador de 32 bits de Microsoft C/C++, un puntero basado es un desplazamiento de 32 bits desde una base de puntero de 32 bits. Se aplica una restricción similar a los entornos de 64 bits, donde un puntero basado es un desplazamiento de 64 bits de la base de 64 bits.

Uno de los usos de los punteros basados en punteros son los identificadores persistentes que contienen punteros. Una lista vinculada formada por punteros basados en un puntero se puede guardar en el disco y recargar en otro lugar de la memoria; los punteros seguirán siendo 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;
};

Al puntero vpBuffer se le 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:

La persistencia de identificadores que contienen punteros también se consigue mediante archivos asignados a memoria.

Cuando se desreferencia un puntero basado, la base se debe especificar explícitamente o se debe conocer implícitamente con la declaración.

Por compatibilidad con versiones anteriores, _based es sinónimo de __based menos que se especifique la opción del compilador /Za (Deshabilitar extensiones de lenguaje).

Ejemplo

El código siguiente muestra cómo se cambia un puntero basado mediante el cambio de 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;
}
1
2
10
11

Consulte también

Palabras clave
alloc_text