English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de lenguaje C

Control de flujo de lenguaje C

Funciones en C

Arreglos en C

Punteros en C

Cadenas en C

Estructura de lenguaje C

Archivo de lenguaje C

C otros

Manual de referencia de C

Puntero void en C

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.

Sintaxis del puntero void

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

Tamaño del puntero void en C

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

Ventajas de los punteros void

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.

¿Por qué usamos punteros void?

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