Una variable normal como int x almacena un valor, y el programa también coloca ese valor en algún lugar de la memoria. El nombre x es una etiqueta práctica que el compilador te permite usar para leer y escribir ese valor almacenado sin tener que pensar en la ubicación física.
Esa ubicación sigue siendo importante porque, en última instancia, la CPU carga y almacena datos utilizando direcciones. Incluso cuando escribes x = 5;, el código compilado utiliza una dirección internamente para localizar los bytes que pertenecen a x y sobrescribirlos.
Una forma útil de visualizar la memoria es como una larga matriz de bytes, donde cada byte tiene un índice llamado dirección. Cuando el compilador crea x, selecciona un rango de direcciones lo suficientemente grande como para albergar un int y hace que cada uso del nombre x haga referencia a ese rango.
De este modelo se derivan dos consecuencias:
x, sobrescribes los bytes en el mismo rango de direcciones.y = x, normalmente obtienes un rango de direcciones independiente con una copia del valor; por tanto, los cambios posteriores en x no afectan a y.Un puntero es una variable cuyo valor es una dirección. No almacena el int en sí, sino la ubicación de ese int en la memoria, permitiéndote seguir dicha dirección para acceder al int.
En C++, dos operadores hacen esto posible:
&x // operador de dirección (address-of): obtiene la dirección donde se almacena x
*p // operador de desreferencia (dereference): accede al valor almacenado en la dirección contenida en p
Analiza el concepto de las casillas de memoria y cómo el valor puede cambiar mientras la dirección permanece constante.
Invariante clave Si
pes igual a&x, entonces*phace referencia al mismo valor almacenado quex.
Una vez que se puede almacenar una dirección, es posible compartir el acceso a un objeto en lugar de copiarlo. Esto se manifiesta en varias situaciones comunes:
nullptr para indicar la ausencia de objeto, lo que hace explícita dicha ausencia en el tipo.Compare los escenarios de copia frente a los de compartición y observe las diferencias en cuanto a mutación y coste.