seegongsik
Programación

Qué es una referencia en programación

Mientras un programa se ejecuta, los valores que creamos tienen que estar en algún sitio. Ese sitio es la memoria. Imagina una larga pared de casilleros numerados, donde cada etiqueta con nombre es una nota que señala uno de esos casilleros.

01

Los valores están en algún sitio

Todo el tiempo que un programa se ejecuta, cada valor ocupa un lugar en algún punto de la memoria.
La memoria es como una pared llena de casilleros numerados.
Al crear un valor, entra en un casillero vacío, y el programa lo recuerda por el número del casillero.

casilla 1
casilla 2
casilla 3
casilla 4
casilla 5

Pulsa "guardar valor" y un valor entra en una casilla vacía, con su número a la vista.

Cada valor tiene ya su casilla y su número.
Pero en el código no escribimos "casilla 7", sino nombres como 'a' o "puntuación".
Entonces, ¿cómo se conecta un nombre con un número de casilla?

02

La etiqueta señala un lugar

Un nombre no es el valor en sí, sino una nota que sabe en qué casilla mirar.
Nombre 'a' → casilla 3 → el 7 que hay dentro.
Así que, cuando usas 'a', el programa sigue la nota, abre la casilla 3 y lee el 7. Eso es lo que significa "apuntar".

a
→
casilla 3
7

Pulsa "seguir a" y sigue la nota hasta la casilla para sacar el valor de dentro.

El nombre apunta a una casilla, y el valor está dentro de esa casilla.
Esta nota que apunta se llama referencia.
A partir de aquí viene lo realmente importante. ¿Qué pasa si "le das a también a b"?

03

Los valores pequeños se copian

Si le das a b un valor pequeño, como un número, ese valor se duplica en una casilla nueva.
Ahora a está en la casilla 3 y b en la casilla 5: dos casillas distintas.
Así que, aunque cambies a por 9, b sigue siendo 7. Los dos son independientes, cada uno con su valor.

a
→
casilla 3
7

Pulsa "copiar a b" y luego "cambiar a": b no cambia porque está en otra casilla.

Los valores pequeños copiados no se afectan entre sí, y todo queda limpio.
Pero con las cosas grandes, como los objetos, la historia es otra, porque duplicar algo grande entero cuesta mucho.
Así que normalmente ocurre otra cosa en lugar de copiar.

04

Las cosas grandes apuntan juntas al mismo lugar

Cuando le das un objeto a b, normalmente no se duplica el objeto entero, sino que se hace que b apunte a la misma casilla.
Ahora a y b, dos notas, apuntan juntas a una casilla.
Así que si cambias el objeto a través de a, también se ve cambiado a través de b. Una sola cosa con dos nombres.

a
↓
casilla 4
objeto: 1

Pulsa "b = a" y luego "cambiar mediante a": como es la misma casilla, b también muestra el cambio.

Dos nombres apuntan a una casilla, así que cambiar uno cambia los dos.
Aquí es donde más se sorprenden quienes empiezan a programar: "¿Por qué cambió b si ni lo toqué?".
Ahora ya sabes la respuesta: apuntaban a la misma casilla.

05

Si sabes a qué apunta cada cosa, se acaba la confusión

La confusión siempre se reduce a una sola cosa.
¿El nombre tiene su propia copia, o apunta a una misma cosa junto con otro nombre?
Un valor pequeño se copia, así que cada uno va por su lado; a una cosa grande se apunta desde el mismo lugar, así que se mueven juntos.
Si recuerdas esta distinción, se acaban las sorpresas.

Elige "valor pequeño" o "cosa grande", haz que haga la misma tarea y verás cómo se separan los resultados.

Esta es la base de la programación.
Partiendo de un solo valor, agrupamos, repetimos, pusimos nombres, reunimos cosas en objetos, las arreglamos depurando e hicimos que una máquina las ejecutara.
Y ahora hemos visto dónde está todo eso y a qué apuntan los nombres, así que ya tienes una base sólida.

En una líneaUn valor está en una casilla (dirección) de la memoria, y un nombre es una nota que apunta a esa casilla. Si le das un valor pequeño a otro nombre, se copia en una casilla nueva y los dos son independientes; con una cosa grande (un objeto), normalmente los dos nombres apuntan a la misma casilla, así que cambiar uno cambia el otro. Si sabes a qué apunta cada cosa, la confusión desaparece.
← Programación
¿Te fue útil? Apoyar seegongsik