Une variable ordinaire comme int x stocke une valeur, et le programme place également cette valeur quelque part en mémoire. Le nom x est une étiquette pratique que le compilateur vous permet d’utiliser pour lire et écrire cette valeur stockée sans avoir à vous soucier de son emplacement physique.
Cet emplacement reste toutefois important, car le processeur (CPU) effectue finalement ses opérations de chargement et de stockage en utilisant des adresses. Même lorsque vous écrivez x = 5;, le code compilé utilise en coulisses une adresse pour localiser les octets appartenant à x et les écraser.
Une façon utile de concevoir la mémoire est de la voir comme un long tableau d’octets, où chaque octet possède un index appelé « adresse ». Lorsque le compilateur crée x, il choisit une plage d’adresses suffisamment vaste pour contenir un int, puis fait en sorte que chaque utilisation du nom x renvoie à cette plage.
Ce modèle entraîne deux conséquences :
x, vous écrasez les octets situés dans la même plage d’adresses.y = x, vous obtenez généralement une plage d’adresses distincte contenant une copie de la valeur ; ainsi, les modifications ultérieures apportées à x n’affectent pas y.Un pointeur est une variable dont la valeur est une adresse. Il ne stocke pas l’entier (int) lui-même, mais l’emplacement où cet entier réside en mémoire ; vous pouvez ainsi suivre cette adresse pour accéder à l’entier.
En C++, deux opérateurs permettent de concrétiser ce concept :
&x // opérateur d'adresse : produit l'adresse où x est stocké
*p // opérateur de déréférencement : accède à la valeur stockée à l'adresse contenue dans p
Étudiez le fonctionnement des cases mémoire et la manière dont la valeur peut changer alors que l’adresse reste identique.
Invariant clé Si
pest égal à&x, alors*pfait référence à la même valeur stockée quex.
Une fois qu’il est possible de stocker une adresse, on peut partager l’accès à un objet au lieu de le copier. Cela se manifeste dans plusieurs situations courantes.
nullptr pour indiquer l’absence d’objet, ce qui rend cette absence explicite au niveau du type.Comparez les scénarios de copie et de partage, et observez les différences en matière de mutation et de coût.