Pointeur sur rien, pointeur sur tout

Il existe un type spécial nommé void, que l’on utilise lorsqu’une fonction n’a pas d’arguments, 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 n’importe 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, lorsqu’on 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 l’adresse source vers l’adresse dest, et renvoie dest. On voit ici que seule l’adresse 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 l’a vu au paragraphe précédent.

Exercice 3.6

Réécrivez la fonction char *strcpy(char *dest, char *source) qui recopie la chaîne source dans dest (en supposant qu’il y a assez de place), et renvoie dest, uniquement avec des pointeurs. Écrire une seconde version utilisant memmove et strlen.

Voir solution

En contrepartie, il est interdit de faire des opérations arithmétiques sur les pointeurs de type void*, puisqu’on ne connaît pas la taille de ce qu’ils 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  l’adresse de sizeof(int)2

ou utiliser une variable pointeur de type adéquat.

Exercice 3.7

Écrire une implémentation de memmove. On tiendra compte du fait que les deux zones mémoire peuvent se recouvrir, et que l’opération doit se faire correctement dans tous les cas.

Voir solution
Précédent Précédent Sommaire Sommaire Suivant Suivant