C vous permet de créer une foule autour d’un seul emplacement mémoire. Vous n’êtes pas obligé de vous contenter d’un seul pointeur. N’importe quel nombre de pointeurs peut pointer vers la même adresse. Ce n’est pas un bug. C’est une fonctionnalité de la façon dont C gère les références mémoire.
Considérons une simple variable entière « i ». Vous pouvez déclarer trois pointeurs distincts : p, q et r. Le code est simple.
Regardez cette dernière ligne. r pointe vers la même chose que p pointe vers la même chose. Et puisque « p » se voit déjà attribuer l’adresse de « i », « r » pointe également vers « i ».
L’opérateur d’affectation copie l’adresse du côté droit vers le côté gauche. Il ne copie pas la valeur stockée à cette adresse. Il copie l’emplacement lui-même. Il s’agit d’une distinction clé dans l’arithmétique des pointeurs.
Après exécution, « i » a quatre noms. Vous pouvez désigner l’entier par « i ». Vous pouvez le modifier via *p. Vous pouvez le lire via *q. Vous pouvez également y accéder en utilisant *r.
Il n’y a pas de limite au nombre de pointeurs pouvant contenir la même adresse. Vous pouvez déclarer « s », « t » et « u » si vous le souhaitez. Ils ne seraient que des alias pour le même morceau de mémoire.
Cette flexibilité est importante. Il permet aux fonctions de partager des références à des données sans copier de grandes structures. Il permet des structures de données complexes dans lesquelles plusieurs nœuds pointent vers le même enfant. Cela rend la gestion des ressources en C plus efficace.
Mais cela introduit également des risques. Si un pointeur modifie la valeur, tous les pointeurs voient le changement. Il n’y a pas d’isolement. Il faut être prudent. Un pointeur change l’entier. Les autres le voient immédiatement.
La variable
ia désormais quatre noms :i,*p,*qet*r.
Il s’agit de l’arithmétique de base des pointeurs. C’est fondamental pour comprendre les modèles de mémoire C. Mais c’est aussi là que les choses se compliquent. Plusieurs références à la même adresse signifient plusieurs façons de corrompre les données.
Vous pouvez enchaîner les affectations de pointeurs à l’infini. s = r; t = s;. Tout renvoie au « je ». Le compilateur s’en fiche. Le runtime s’en fiche. Ce ne sont que des adresses mémoire.
Pourquoi est-ce important pour les utilisateurs quotidiens ? Si vous écrivez du code C, vous comptez sur cela. Si vous déboguez un crash, c’est souvent le coupable. Les erreurs d’utilisation après libération se développent dans les environnements où les pointeurs sont réaffectés mais non annulés.
L’efficacité a un coût. Complexité. Vous devez savoir à qui appartiennent les données. Qui est autorisé à le modifier. Avec plusieurs pointeurs, ce suivi devient plus difficile.
Mais le pouvoir est indéniable. Vous pouvez passer des pointeurs vers des fonctions. Modifiez la valeur. La variable d’origine reflète le changement. C’est ainsi que C obtient une sémantique de référence sans objets.
C’est un concept simple. Copiez l’adresse. Ne copiez pas la valeur. Laissez plusieurs noms faire référence à un seul emplacement. Utilisez-le à bon escient.




























