Punteros a Void

En C, “void” se utiliza como un tipo de dato especial que indica la ausencia de tipo. En otras palabras, se usa cuando una función no devuelve ningún valor o cuando se declara un puntero que no tiene un tipo de dato específico. Aquí hay dos usos comunes de “void” en C:

  1. Funciones que no devuelven valores: Cuando defines una función en C que no devuelve ningún valor, su tipo de retorno se especifica como “void”. Por ejemplo:
void miFuncion() {
    // Código de la función que no devuelve ningún valor
}

En este caso, la función “miFuncion” no devuelve ningún valor cuando se llama.

  1. Punteros void: Un puntero “void *” es un tipo de puntero genérico que puede apuntar a cualquier tipo de dato. Se utiliza cuando no se conoce el tipo de dato al que se apuntará en tiempo de compilación, pero se determinará en tiempo de ejecución. Aquí hay un ejemplo:
void *puntero;
int entero = 42;
double decimal = 3.14;

puntero = &entero;  // Puntero ahora apunta a un entero
puntero = &decimal; // Puntero ahora apunta a un número decimal

// No puedes desreferenciar un puntero void directamente, necesitas realizar una conversión de tipo apropiada.

El uso de punteros “void *” es útil en situaciones donde necesitas crear funciones o estructuras de datos genéricas que puedan trabajar con diferentes tipos de datos. Debes tener cuidado al trabajar con punteros “void *” ya que necesitas realizar conversiones de tipo adecuadas para acceder a los datos apuntados.

¿ Qué tipo de datos conviene si no se el tipo de dato?

No puedo declarar un void z;

Porque en este caso el compilador no sabe como interpretarlo ni cuanta memoria reservar.

Por lo tanto lo unico que puedo definir como “void” es PUNTEROS. Un puntero tipo void va a ser un puntero a “algun” tipo de dato.

Ejemplo:

Si yo quisiera hacer :

*z = ‘a’; ESTARIA MAL. Porque el puntero es de tipo VOID, y no puedo asignarlo sin antes castearlo. Porque desreferenciaría a una dirección de cualquier tipo y me arrojaría el siguiente error:

Por lo tanto debería castear al tipo que necesito de la siguiente manera:

En este caso lo que estoy diciendo es que el puntero va a estar apuntando al tipo de dato char.

Ahora si yo quisiera hacer z++ para desplazarme:

Esto estaría mal porque con el tipo de dato VOID no sabe cuanto desplazarse. Por ende debemos castearlo:

((char*)z)++; //ESTO LO DEBO HACER SI QUIERO MODIFICAR LA DIRECCION


Ahora supongamos que tenemos el siguiente código:

Lo que hice en z es que apunte a la dirección que tiene un puntero a entero (pe). Si yo quisiera sumarle 1 al valor entero, desde mi puntero z lo que debería hacer seria:

NO PUEDO CAMBIAR DE TIPO A Z, por eso debo castearlo siempre que lo use.

EJERCICIO DE PUNTEROS A VOID