Pourquoi tapez un pointeur vide?

Étant nouveau pour le C, la seule utilisation pratique que je tire des pointeurs vides concerne les fonctions polyvalentes pouvant stocker différents types de données dans un pointeur donné. Par conséquent, je n’ai pas transtypé mon pointeur lors de l’allocation de mémoire.

J’ai vu des exemples de code qui utilisent parfois des pointeurs vides, mais ils sont transtypés. Pourquoi est-ce utile? Pourquoi ne pas créer directement le type de pointeur souhaité au lieu d’un vide?

Il existe deux raisons de convertir un pointeur vide dans un autre type en C.

  1. Si vous souhaitez accéder à quelque chose pointé par le pointeur ( *(int*)p = 42 )
  2. Si vous écrivez réellement du code dans le sous-ensemble commun de C et C ++, plutôt que de “vrai” C. Voir aussi Dois-je convertir le résultat de malloc?

La raison pour 1 devrait être évidente. Le numéro deux est dû au fait que C ++ n’autorise pas la conversion implicite de void* vers d’autres types, alors que C l’autorise.

Si vous souhaitez les déréférencer, vous devez affecter des pointeurs vides à un autre élément. Par exemple, vous obtenez un pointeur vide comme paramètre de fonction et vous êtes sûr que ce soit un entier:

 void some_function(void * some_param) { int some_value = *some_param; /* won't work, you can't dereference a void pointer */ } void some_function(void * some_param) { int some_value = *((int *) some_param); /* ok */ } 

Votre pointeur vide peut représenter un type plus complexe, par exemple une structure à déréférencer afin d’accéder à ses membres.

 typedef struct CombinedData { int memberA; double memberB; } CombinedData; void fun(void* data) { CombinedData* p = (CombinedData*)data; doSomethingWith(p->memberA, p->memberB); }