Puntero de C ++ a void (con ejemplos)

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 doublevariable de tipo. Sin embargo, el puntero es de inttipo.

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 ptrrecibe el valor de &f.

La salida muestra que el puntero void ptr almacena la dirección de una floatvariable f.

Como voides 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_castoperador. 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 voidpuntero ptr.

Como no podemos desreferenciar un voidpuntero, no podemos usar *ptr.

Sin embargo, si convertimos el void*tipo de puntero al float*tipo, podemos usar el valor apuntado por el voidpuntero.

En este ejemplo, hemos utilizado el static_castoperador 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_castse prefiere a la fundición estilo C.

Nota: los punteros vacíos no se pueden utilizar para almacenar direcciones de variables con calificadores consto volatile.

 void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;

Articulos interesantes...