L’exemple qui suit permet de montrer la différence entre les
type *void et
l’ancien type générique
*char. Il s’agit
d’écrire une fonction qui copie
une zone mémoire de n octets
dans une autre, et rend un pointeur sur la
première zone. Il devra être facile et souple d’utiliser cette
fonction quelque
soit le type des paramètres
utilisés.
La définition de
fonction ci-dessous est incorrecte, car il est interdit
d’accéder à l’objet pointé par un pointeur générique.
void * copie (void * dest , void * depart, int n) {
Ce qui permettra d’appeler la fonction pour
copier par exemple des tableaux
(l’utilisation de *char aurait
nécessité des conversions explicites par l’opération cast).
Le second exemple correspond à la définition d’une
fonction générale
d’échange de deux pointeurs sans
affecter les objets pointés. Il faut utiliser le type **void, et non
*void.
La raison est que le passage des paramètres en C se fait par
copie, les paramètres
effectifs seraient inchangés avec le type *void.
void echange (void ** p , ** q) {
void *inter ;
inter = *p ;
*p = *q ;
*q = inter ;
}
int *int 1 ; int 2 ;
/* pour pouvoir échanger les valeurs des pointeurs int 1
et int2, je passe leur adresse */