C – pointeurs dans les fonctions et type de variable vide?

S’il vous plaît expliquer ce que signifie un prototype comme celui-ci

void *runner(void *param) 
  1. Comment un type de variable est-il vide?
  2. Que signifie le nom de la fonction avec * runner?
  3. Est-ce l’adresse de la fonction?

Tout d’abord, il n’y a absolument aucune différence entre void* runner et void *runner . Le nom de la fonction est runner . Deuxièmement, une fonction PEUT être déclarée void ce qui signifie simplement qu’elle ne renvoie rien du tout.

Cependant cette signature est différente. Il renvoie un void* , ce qui signifie simplement un pointeur sur un type de données non spécifié. Ou une façon plus simple d’y penser, cela retourne une adresse mémoire.

Il en va de même pour le void *param , il s’agit simplement d’accepter une adresse mémoire.

MODIFIER

Cela pourrait le rendre un peu plus clair:

 void func(void *ptr); // take in a generic memory address, return nothing void *func(void *ptr); // take in a generic memory address, return similar void *func(void); // Function takes no parameters (necessary in C, optional in C++) void *func(void param); // Invalid! As you guessed, this would be pointless. void *func(); // Preferred syntax in C++, function takes in nothing and returns a generic memory address // In C this means it takes an undetermined number of arguments void func(); // In C++: function takes in nothing, returns nothing // In C: function takes in an undetermined number of arguments, returns nothing 

Question 1: Le type de variable est void *, not void. Ceci est un pointeur générique garanti pour pouvoir stocker un pointeur sur des données. Cela peut ou non contenir un pointeur sur une fonction, mais c’est une autre discussion.

Question 2: Le nom de la fonction n’est pas * runner, c’est runner. En C / C ++, les espaces ne signifient généralement pas grand chose.

Question 3: Non, cela signifie simplement que la fonction renvoie un autre de ces pointeurs génériques vides *. Ces pointeurs sont parfaits pour accepter tout type de variable (par exemple, avant que nous n’ayions des modèles pour le faire pour nous).

Le nom de la fonction n’est pas *runner , c’est juste un runner . Son type de retour est nul * . Encore une fois, le type d’argument n’est pas void . C’est void* . Ce qui signifie un pointeur qui peut pointer sur n’importe quoi.

void* est le type, pas void . Un void* est un pointeur sur “quelque chose”. On ne sait pas ce qu’il indique, mais l’idée est que cela fonctionne comme une sorte de pointeur neutre. Cela peut indiquer quelque chose en particulier, de sorte que la fonction à laquelle le pointeur est atsortingbué doit avoir un accord implicite sur ce que cette chose indique réellement.

Par exemple, si vous avez une fonction void FuncName(Type *value) , la value est un pointeur sur un object Type . Il s’agit d’un accord explicite entre l’appelant et la fonction selon lequel un pointeur d’object Type sera transmis. Le compilateur empêchera de transmettre accidentellement le mauvais type de pointeur. L’utilisation d’un void* signifie qu’il n’y a pas d’accord explicite. Il peut y en avoir une implicite, mais le compilateur ne vous empêchera pas de transmettre la “mauvaise” chose.

void *runner(void *param) est une fonction appelée runner qui prend un seul paramètre void* et renvoie une seule void * . Beaucoup de programmeurs aiment mettre le * côté d’un nom plutôt que du type.

C vous permet d’utiliser void * comme types de pointeurs prenant en charge l’écriture de fonctions génériques. En tant que void * param peut prendre n’importe quel type de pointeur. Cependant, vous devez faire très attention lorsque vous manipulez ces pointeurs car ils viennent avec leur propre ensemble de limitations. Vous ne pouvez pas déréférencer un vide *, il doit être converti en un type valide. Il en va de même pour l’application de l’arithmétique de pointeur.

Dans ce cas, runner est un nom de méthode qui prend un paramètre du type void *. Il peut donc être de n’importe quel type, même un ADT défini par l’utilisateur. Cependant, la plupart des fonctions qui acceptent void * ont une sorte de rappel que l’appelant enregistre. L’appelant est ensuite rappelé pour le traitement des données, où le vide * est renvoyé à l’appelant, qui sait alors quel était le type d’origine du vide * afin de pouvoir le convertir en un type correct.

Une utilisation typique de cette méthode est la méthode qsort qui peut sortinger un tableau de tout type défini par l’utilisateur tant que l’appelant implémente la méthode de comparaison qui accepte deux instances du type (via void *), puis renvoie -1,0 ou 1 en fonction de La comparaison. Spécifiez que le qsort est appliqué à ints, alors l’implémentation du comparateur ressemble à ceci:

 int compare(void * n1, void* n2) { int *i = (int*) n1; int *j = (int*) n2; if (*i < *j){ (now dereference the int*) return -1 } else if ( *i == *j) { return 0; } else { return 1 } } 

tout d’abord: void *runner(void *param) besoin d’un ; à la fin. avec le prototypage, vous mettez une “référence” disant “je vais le faire plus tard”. Cela vous permet de le placer plus bas dans le code pour ne pas encombrer la partie supérieure.

Q1-Réponse:
void est le type de retour de la fonction. dans ce cas, rien ne sera retourné. Si c’était une variable vide, vous pourriez y conserver n’importe quoi, mais vous auriez besoin de la transtyper pour obtenir sa valeur.

Q2-Réponse:
*runner et * runner = la même chose. void* est à nouveau le type de retour. void et void* sont très différents. Bien qu’ils se ressemblent, ils sont TRÈS différents. comme un int* et un int l’adresse contient un entier et l’autre, un entier.

Q3-Réponse:
ce n’est pas l’adresse de la fonction (comme vous semblez l’impliquer), c’est le type de retour. par exemple, si vous avez int* après votre code, vous tapez quelque chose comme

 int* function() { int* a; *a = 5; //CODE HERE ... return a; } 

donc, il DOIT renvoyer un pointeur sur un entier, il ne peut pas renvoyer un int car le compilateur lève une exception / erreur. c’est comme essayer de mettre un personnage dans un int.

Découvrez toute la documentation sur http://www.cplusplus.com, c’est vraiment utile.

J’espère que cela a aidé!

Paix.