Il existe un type spécial nommé void, que lon utilise lorsquune fonction na pas darguments, ou pas de résultat ; il signifie en quelque sorte « rien » .
Il est parfaitement possible de déclarer un pointeur de type void*
. Dans ce cas, on obtient un « pointeur sur rien » , ou plutôt un « pointeur sur tout » . En effet, dans ce cas, on peut placer nimporte quel autre pointeur dans p sans faire de changement de type :
int k; char *s; void *p = &k; p = s;
Cette propriété est surtout utilisée pour des arguments de fonction, lorsquon souhaite recevoir un pointeur quelconque. Par exemple, la fonction memmove
est approximativement déclarée ainsi :
void *memmove(void* dest, void* source, unsigned taille);
Cette fonction recopie taille octets de ladresse source vers ladresse dest, et renvoie dest. On voit ici que seule ladresse placée dans les pointeurs est importante ; la nature de ce qui est pointé est sans intérêt. On peut ainsi recopier des blocs entiers de mémoire de tous types, par exemple des tableaux, comme on la vu au paragraphe précédent.
Exercice 3.6 |
Réécrivez la fonction |
Voir solution |
En contrepartie, il est interdit de faire des opérations arithmétiques sur les pointeurs de type void*
, puisquon ne connaît pas la taille de ce quils pointent. Ainsi lécriture :
void *p; p++; // incorrect
provoque le message Error : Size of this expression is unknown or zero, la taille de cette expression est nulle ou inconnue. Il faut écrire un changement de type :
( (int*) p )++; // augmente ladresse de sizeof(int)2
ou utiliser une variable pointeur de type adéquat.
Exercice 3.7 |
Écrire une implémentation de |
Voir solution |
Précédent | Sommaire | Suivant |