Hasta ahora, mi comprensión del puntero vacío es la siguiente.
Cuando se declara una variable de puntero utilizando la palabra clave void, se convierte en una variable de puntero de uso general. La dirección de cualquier variable de cualquier tipo de datos (char, int, float, etc.) se puede asignar a una variable de puntero vacío.
main()
{
int *p;
void *vp;
vp=p;
}
Dado que se puede asignar otro puntero de tipo de datos al puntero vacío, entonces lo usé en la función absolut_value (el código se muestra a continuación). Para hacer una función general.
Traté de escribir un código C simple que toma un entero o flotante como argumento y trata de hacerlo + ve, si es negativo. Escribí el siguiente código,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
Pero recibía un error, así que llegué a saber que mi comprensión con el puntero de vacío no es correcta :(. Así que ahora me moveré hacia la recopilación de puntos, ¿por qué es así?
Lo que necesito entender más sobre los punteros nulos es eso.
Necesitamos encasillar la variable de puntero vacío para desreferenciarla. Esto se debe a que un puntero vacío no tiene ningún tipo de datos asociado. No hay forma de que el compilador pueda saber (¿o adivinar?) A qué tipo de datos apunta el puntero vacío. Por lo tanto, para tomar los datos señalados por un puntero vacío, los encasillamos con el tipo correcto de datos retenidos dentro de la ubicación de los punteros vacíos.
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Un puntero nulo puede ser realmente útil si el programador no está seguro sobre el tipo de datos ingresados por el usuario final. En tal caso, el programador puede usar un puntero vacío para apuntar a la ubicación del tipo de datos desconocido. El programa se puede configurar de tal manera que solicite al usuario que informe el tipo de datos y la conversión de tipos se puede realizar de acuerdo con la información ingresada por el usuario. A continuación se incluye un fragmento de código.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
Otro punto importante que debe tener en cuenta sobre los punteros vacíos es que: la aritmética del puntero no se puede realizar en un puntero vacío.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Así que ahora entendí cuál fue mi error. Estoy corrigiendo lo mismo.
Referencias
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
El nuevo código es como se muestra a continuación.
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
Gracias,