Jusqu'à présent, ma compréhension du pointeur de vide est la suivante.
Lorsqu'une variable de pointeur est déclarée à l'aide du mot clé void, elle devient une variable de pointeur à usage général. L'adresse de toute variable de tout type de données (char, int, float etc.) peut être affectée à une variable de pointeur void.
main()
{
int *p;
void *vp;
vp=p;
}
Comme un autre pointeur de type de données peut être affecté au pointeur void, je l'ai donc utilisé dans la fonction absolut_value (code ci-dessous). Pour faire une fonction générale.
J'ai essayé d'écrire un code C simple qui prend un entier ou un flottant comme argument et essaie de le rendre + ve, s'il est négatif. J'ai écrit le code suivant,
#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;
}
Mais j'obtenais une erreur, alors j'ai appris que ma compréhension du pointeur de vide n'était pas correcte :(. Alors maintenant, je vais passer à collecter des points pourquoi.
Ce que j'ai besoin de mieux comprendre sur les pointeurs vides, c'est que.
Nous devons transtyper la variable de pointeur void pour la déréférencer. Cela est dû au fait qu'un pointeur void n'a aucun type de données associé. Il n'y a aucun moyen pour le compilateur de savoir (ou de deviner?) Quel type de données est pointé par le pointeur void. Donc, pour prendre les données pointées par un pointeur void, nous les avons typées avec le type correct des données contenues dans l'emplacement des pointeurs vides.
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 pointeur void peut être vraiment utile si le programmeur n'est pas sûr du type de données des données entrées par l'utilisateur final. Dans un tel cas, le programmeur peut utiliser un pointeur vide pour pointer vers l'emplacement du type de données inconnu. Le programme peut être réglé de manière à demander à l'utilisateur d'informer le type de données et la diffusion de type peut être effectuée en fonction des informations entrées par l'utilisateur. Un extrait de code est donné ci-dessous.
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 autre point important que vous devez garder à l'esprit à propos des pointeurs vides est que - l'arithmétique des pointeurs ne peut pas être exécutée dans un pointeur vide.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Alors maintenant, j'ai compris quelle était mon erreur. Je corrige la même chose.
Références :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Le nouveau code est comme indiqué ci-dessous.
#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;
}
Merci,
void *
pointeurs de la même manière quechar *
, mais ce n'est pas standard et vous ne devriez pas vous y fier.