204 votes

Que signifie void* et comment l'utiliser ?

Aujourd'hui, en lisant le code d'autres personnes, j'ai vu quelque chose comme void *func(void* i); Qu'est-ce que cela signifie ? void* signifie ici pour le nom de la fonction et pour le type de variable, respectivement ?

En outre, quand avons-nous besoin d'utiliser ce type de pointeur et comment l'utiliser ?

3voto

Jeyaram Points 4230

Un pointeur vide est connu sous le nom de pointeur générique. Je voudrais expliquer avec un exemple de scénario pthread.

La fonction thread aura le prototype suivant

void *(*start_routine)(void*)

Les concepteurs de l'API pthread ont pris en compte les arguments et les valeurs de retour de la fonction thread. Si ces choses sont rendues génériques, nous pouvons faire un type cast vers void* tout en envoyant comme argument. De même, la valeur de retour peut être récupérée de void* (mais je n'ai jamais utilisé les valeurs de retour de la fonction thread).

void *PrintHello(void *threadid)
{
   long tid;

   // ***Arg sent in main is retrieved   ***
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      //*** t will be type cast to void* and send as argument.
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);   
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }    
   /* Last thing that main() should do */
   pthread_exit(NULL);
}

2voto

md5 Points 14957

La norme C11 (n1570) §6.2.2.3 al1 p55 dit :

Un pointeur vers void peut être converti en ou depuis un pointeur vers n'importe quel type d'objet. type. Un pointeur vers n'importe quel type d'objet peut être converti en un pointeur vers void et inversement ; le résultat doit être égal au pointeur d'origine. d'origine.

Vous pouvez utiliser ce pointeur générique pour stocker un pointeur vers n'importe quel type d'objet, mais vous ne pouvez pas utiliser les opérations arithmétiques habituelles avec lui et vous ne pouvez pas le déférencer.

1voto

mathematician1975 Points 13448

A void* est un pointeur, mais le type de ce vers quoi il pointe n'est pas spécifié. Lorsque vous passez un pointeur vide à une fonction, vous devez savoir quel était son type afin de le remettre dans le type correct plus tard dans la fonction pour l'utiliser. Vous trouverez des exemples dans pthreads qui utilisent des fonctions ayant exactement le même prototype que dans votre exemple et qui sont utilisées comme fonction de fil conducteur. Vous pouvez alors utiliser la fonction void* comme un pointeur vers un type de données générique de votre choix, puis vous le remettez dans ce type pour l'utiliser dans votre fonction thread. Vous devez cependant être prudent lors de l'utilisation de pointeurs void, car si vous ne castez pas sur un pointeur de son vrai type, vous pouvez vous retrouver avec toutes sortes de problèmes.

0voto

glglgl Points 35668

La fonction prend un pointeur vers un type arbitraire et renvoie un tel.

-4voto

dilara Points 25

Cela signifie pointeur vous pouvez utiliser ce lien pour obtenir plus d'informations sur le pointeur http://www.cprogramming.com/tutorial/c/lesson6.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X