Plusieurs pointeurs pointant vers la même adresse en C

11

C permet à un seul emplacement mémoire d’avoir plusieurs alias. Vous pouvez déclarer plusieurs pointeurs et les faire référencer tous à la même variable. Ce n’est pas seulement une bizarrerie de la langue. Il s’agit d’une fonctionnalité fondamentale qui change la façon dont vous gérez la mémoire et l’accès aux données.

Considérez ce scénario. Vous avez besoin de plusieurs handles pour la même variable entière. Vous pouvez tous les déclarer et les relier instantanément.

Dans ce bloc, « p », « q » et « r » sont tous des pointeurs entiers. Ils pointent tous vers le « je ». L’affectation r = p ne copie pas la valeur de i. Il copie l’adresse stockée dans p. Puisque p contient l’adresse de i, r contient désormais également l’adresse de i.

Une variable, plusieurs noms

Après l’exécution, il y a une variable entière « i » en mémoire. Mais il existe quatre façons de faire référence à ces données exactes.

  1. i  : Le nom de la variable d’origine.
  2. *p  : La valeur à l’adresse dans p.
  3. *q  : La valeur à l’adresse dans q.
  4. *r  : La valeur à l’adresse dans r.

Ils sont identiques. Changez « i ». *p change. Changez *q. « je » change. Les données résident à une seule adresse. Les pointeurs ne sont que des étiquettes.

Il n’y a pas de limite stricte quant au nombre de pointeurs pouvant contenir la même adresse. Vous pouvez les enchaîner indéfiniment. a = &je; b = une; c = b; d = c; fonctionne de la même manière. Chaque affectation copie la valeur du pointeur. Il ne crée pas de nouvelle copie des données.

“N’importe quel nombre de pointeurs peut pointer vers la même adresse.”

Cette fonctionnalité est puissante pour transmettre des références autour de fonctions ou créer des structures liées. Cela permet de limiter l’utilisation de votre mémoire. Cela introduit également un risque. Si vous déréférencez l’un de ces pointeurs, vous touchez le même octet sous-jacent. Les erreurs dans un alias se répercutent sur tous. Mais lorsqu’elle est utilisée correctement, cette fonctionnalité constitue une pratique standard en C.