English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hasta ahora, hemos estudiado que la dirección asignada al puntero debe ser del mismo tipo que se especifica en la declaración del puntero. Por ejemplo, si declaramos un puntero int, este puntero int no puede apuntar a una variable float o a algún otro tipo de variable, es decir, solo puede apuntar a variables de tipo int. Para superar este problema, utilizamos punteros void. Los punteros void son punteros genéricos que pueden apuntar a cualquier tipo de datos. Podemos asignar la dirección de cualquier tipo de datos a un puntero void y asignar un puntero void a cualquier tipo de puntero, sin necesidad de realizar ninguna conversión explícita de tipo.
void *Nombre del puntero
A continuación, se muestra la declaración del puntero void:
void *ptr;
En la declaración anterior, void es el tipo de puntero y 'ptr' es el nombre del puntero.
Veamos algunos ejemplos:
int i=9; //Inicialización de variable entera int *p; // Declaración de puntero de entero float *fp; // Declaración de puntero de punto flotante void *ptr; //Declaración de puntero void p=fp; // Incorrecto. fp=&i; // Incorrecto ptr=p; // Correcto ptr=fp; // Correcto ptr=&i; // Correcto
El tamaño del puntero void en el lenguaje C es el mismo que el tamaño del puntero de tipo carácter. La representación del puntero void es la misma que la del puntero de tipo carácter. El tamaño del puntero puede variar según la plataforma utilizada.
Veamos el siguiente ejemplo:
#include <stdio.h> int main() { void *ptr = NULL; //Puntero void int *p = NULL;// Puntero entero char *cp = NULL;//Puntero de caracteres float *fp = NULL;//Puntero de coma flotante //El tamaño del puntero void printf("El tamaño del puntero void = %d\n\n",sizeof(ptr)); //El tamaño del puntero entero printf("El tamaño del puntero entero = %d\n\n",sizeof(p)); //El tamaño del puntero de caracteres printf("El tamaño del puntero de caracteres = %d\n\n",sizeof(cp)); //El tamaño del puntero de coma flotante printf("El tamaño del puntero de coma flotante = %d\n\n",sizeof(fp)); return 0; }
Resultado de la salida
El tamaño del puntero void = 4 El tamaño del puntero entero = 4 El tamaño del puntero de caracteres = 4 El tamaño del puntero de coma flotante = 4
Aquí están las ventajas de los punteros void:
Las funciones malloc() y calloc() devuelven punteros void, por lo que estas funciones se pueden usar para asignar memoria de cualquier tipo de datos.
#include <stdio.h> #include<malloc.h> int main() { int a=90; int *x = (int*)malloc(sizeof(int)); x=&a; printf("El valor al que apunta el puntero x: %d",*x); return 0; }
Resultado de la salida
El valor al que apunta el puntero x: 90
Los punteros void en C también se pueden usar para implementar funciones genéricas en C.
Debido a su reutilización, usamos punteros void. Los punteros void pueden almacenar cualquier tipo de objeto y podemos recuperar cualquier tipo de objeto utilizando operadores de indirecta con conversión de tipo apropiada.
Vamos a entenderlo a través de un ejemplo.
#include<stdio.h> int main() { int a=56; //Inicializar una variable entera 'a'. float b=4.5; //Inicialización de la variable de coma flotante 'b'. char c='k'; //Inicialización de la variable de caracteres 'c'. void *ptr; //Declarar un puntero nulo. // Asignar la dirección de la variable "a". ptr=&a; printf("El valor de a es: %d",*((int*); //Asignar la dirección de la variable 'b'. ptr=&b; printf("\nEl valor de b es: %f",*((float*); //Asignar dirección a la variable 'c'. ptr=&c; printf("\n El valor de c es: %c",*((char*); return 0; }
Resultado de la salida
El valor de a es: 56 El valor de b es: 4.500000 El valor de c es: k