Pourquoi plusieurs pointeurs peuvent cibler une seule adresse en C

9

C vous permet de créer du chaos ou de la clarté avec la mémoire. Vous pouvez avoir des dizaines de pointeurs visant tous exactement le même endroit dans la RAM. Ce n’est pas un bug. C’est une fonctionnalité.

Considérons un scénario dans lequel vous déclarez un entier « i ». Vous créez ensuite trois pointeurs entiers : p, q et r.

Le code fait exactement ce à quoi vous pouvez vous attendre. p récupère l’adresse de i. q fait la même chose. r copie tout ce que p contient. Puisque p contient l’adresse de i, r pointe également vers i.

Une fois ces affectations exécutées, vous disposez d’une variable avec quatre noms. « je » est l’original. *p y accède. *q y accède. *r y accède.

Comment fonctionne l’attribution de pointeurs

La clé ici est de comprendre ce qui se passe pendant la mission. Lorsque vous écrivez « q = &i », vous ne copiez pas la valeur de « i ». Vous copiez l’emplacement de i.

Lorsque vous écrivez « r = p », vous copiez l’adresse de « p » dans « r ». Aucune nouvelle mémoire n’est allouée. Aucune donnée n’est dupliquée. La valeur de l’adresse se déplace d’une variable de pointeur à une autre.

Cela signifie qu’il n’y a pas de limite stricte quant au nombre de pointeurs pouvant contenir la même adresse. Vous pouvez créer un millier de pointeurs pointant tous vers « i ». Ils font tous référence au même emplacement mémoire.

Il n’y a pas de limite sur le nombre de pointeurs pouvant contenir (et donc pointer vers) la même adresse.

Ce comportement est fondamental dans la façon dont C gère la mémoire. Il permet des structures de données flexibles telles que des listes chaînées et des arbres. Cela permet également des arguments de fonction efficaces. Passez un pointeur au lieu d’une copie. Modifiez directement les données originales.

Mais cela introduit également des risques. Remplacez « i » par « p ». Regardez « i » à « q ». Le changement est visible partout. Il n’y a qu’une seule source de vérité.

La variable i a désormais quatre noms. ‘je’. *p. *q. *r.

C’est ainsi que fonctionne C. Vous avez un accès direct aux adresses mémoire. Vous pouvez librement créer des alias de données. Il faut juste faire attention à ce que l’on change.