En este tutorial, aprenderemos sobre punteros vacíos y cómo usarlos con la ayuda de ejemplos.
Antes de continuar con este tutorial, asegúrese de verificar los punteros de C ++.
En C ++, no podemos asignar la dirección de una variable de un tipo de datos a un puntero de otro tipo de datos. Considere este ejemplo:
// pointer is of int type int *ptr; // variable is of double type double d = 9.0; // Error // can't assign double* to int* ptr = &d;
Aquí, el error ocurrió porque la dirección es una double
variable de tipo. Sin embargo, el puntero es de int
tipo.
En tales situaciones, podemos usar el puntero para anular (anular punteros) en C ++. Por ejemplo,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
El puntero vacío es un puntero genérico que se utiliza cuando no conocemos el tipo de datos de la variable a la que apunta el puntero.
Ejemplo 1: puntero vacío de C ++
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void ptr = &f; cout << &f << endl; cout << ptr << endl; return 0; )
Salida
0xffd117ac 0xffd117ac
Aquí, el puntero ptr
recibe el valor de &f
.
La salida muestra que el puntero void ptr almacena la dirección de una float
variable f.
Como void
es un tipo vacío, los punteros vacíos no se pueden desreferenciar.
void* ptr; float* fptr; float f = 2.3; // assign float address to void pointer ptr = &f; cout << *ptr << endl; // Error // assign float address to float pointer fptr = &f; cout << *fptr << endl; // Valid
Ejemplo 2: Impresión del contenido de un puntero vacío
Para imprimir el contenido de un puntero vacío, usamos el static_cast
operador. Convierte el puntero de void*
tipo al tipo de datos respectivo de la dirección que está almacenando el puntero:
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void pointer ptr = &f; cout << "The content of pointer is "; // use type casting to print pointer content cout << *(static_cast(ptr)); return 0; )
Salida
El contenido del puntero es 2,3
Este programa imprime el valor de la dirección apuntada por el void
puntero ptr.
Como no podemos desreferenciar un void
puntero, no podemos usar *ptr
.
Sin embargo, si convertimos el void*
tipo de puntero al float*
tipo, podemos usar el valor apuntado por el void
puntero.
En este ejemplo, hemos utilizado el static_cast
operador para convertir el tipo de datos del puntero de void*
a float*
.
Fundición estilo C
También podemos utilizar la fundición de estilo C para imprimir el valor.
// valid cout << *((float*)ptr);
Sin embargo, static_cast
se prefiere a la fundición estilo C.
Nota: los punteros vacíos no se pueden utilizar para almacenar direcciones de variables con calificadores const
o volatile
.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;