Finora la mia minimizzazione sul puntatore vuoto è la seguente.
Quando una variabile di puntatore viene dichiarata utilizzando la parola chiave void, diventa una variabile di puntatore per uso generico. L'indirizzo di qualsiasi variabile di qualsiasi tipo di dati (char, int, float ecc.) Può essere assegnato a una variabile puntatore vuoto.
main()
{
int *p;
void *vp;
vp=p;
}
Poiché è possibile assegnare un altro puntatore di tipo di dati al puntatore vuoto, è stato utilizzato nella funzione absolut_value (codice mostrato di seguito). Per fare una funzione generale.
Ho provato a scrivere un semplice codice C che prende intero o float come argomento e cerca di renderlo + ve, se negativo. Ho scritto il seguente codice,
#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;
}
Ma stavo ricevendo un errore, quindi sono venuto a sapere che la mia comprensione con il puntatore vuoto non è corretta :(. Quindi ora mi sposterò verso la raccolta di punti, perché è così.
Le cose che ho bisogno di capire di più sui puntatori del vuoto sono queste.
Per dereferenziarlo è necessario eseguire il cast della variabile puntatore vuoto. Questo perché un puntatore vuoto non ha alcun tipo di dati associato ad esso. Non è possibile che il compilatore possa sapere (o indovinare?) A quale tipo di dati viene indicato dal puntatore vuoto. Quindi, per prendere i dati a cui punta un puntatore vuoto, li digitiamo con il tipo corretto di dati conservati nella posizione dei puntatori vuoto.
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 puntatore vuoto può essere davvero utile se il programmatore non è sicuro del tipo di dati immesso dall'utente finale. In tal caso, il programmatore può utilizzare un puntatore vuoto per puntare alla posizione del tipo di dati sconosciuto. Il programma può essere impostato in modo tale da chiedere all'utente di informare il tipo di dati e il tipo di casting può essere eseguito in base alle informazioni immesse dall'utente. Di seguito è riportato un frammento di codice.
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
}
Un altro punto importante da tenere presente riguardo ai puntatori vuoti è che - l'aritmetica del puntatore non può essere eseguita in un puntatore vuoto.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Quindi ora ho capito qual era il mio errore. Sto correggendo lo stesso.
Riferimenti :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Il nuovo codice è come mostrato di seguito.
#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;
}
Grazie,