Consejos C: por qué varias variables comparten la misma dirección de memoria

7

En C, puede tener varios punteros, todos apuntando exactamente a la misma ubicación de memoria. No es un error. Es una característica.

Puede declarar tres punteros enteros: p, q y r. Luego puede configurarlos todos para que apunten a la misma variable entera i.

Mira lo que pasa aquí. p obtiene la dirección de i. q también obtiene la dirección de i. r obtiene lo que sea que contenga p. Esa es la dirección de “i”.

Después de ejecutar este código, tienes una situación extraña. i ahora tiene cuatro nombres. Puede acceder a él usando i, *p, *q o *r. Todos se refieren al mismo lugar en la RAM.

Cómo funciona la asignación de puntero

Cuando asignas un puntero a otro, no estás copiando el valor al que apuntan. Estás copiando la dirección.

r = p no copia el número entero i. Copia la dirección de memoria almacenada en p. Dado que “p” tiene la dirección de “i”, “r” ahora también tiene la dirección de “i”.

No hay límite en cuanto a la cantidad de punteros que pueden compartir una dirección. Podrías tener diez consejos. O cien. Todos simplemente apuntan a lo mismo.

Por qué esto es importante

Este comportamiento cambia su forma de pensar acerca de los datos. Una única variable en la memoria puede tener muchos alias. Si cambia el valor a través de un puntero, todos los demás punteros ven el cambio.

Ahora “i” es 10. “q” es 10. “ r” es 10. Todos están mirando los mismos datos.

Esto es útil. Le permite pasar referencias a funciones sin copiar estructuras grandes. Permite que diferentes partes de su código funcionen con los mismos datos. Pero también significa que hay que tener cuidado. Cambiar un puntero puede afectar a otros.

Conceptos erróneos comunes

Algunos principiantes piensan que asignar punteros copia los datos. No es así. Copia la dirección.

Otros se preguntan si existe un límite. No hay ninguno. El lenguaje le permite crear tantos punteros como necesite. El compilador no te detiene.

El resultado final

Varios punteros pueden apuntar a la misma dirección. Este es el comportamiento estándar de C. Pueden asignarse punteros entre sí. Se copia la dirección, no el valor. La variable sigue siendo la misma. Los nombres simplemente se multiplican.

“No hay límite en la cantidad de punteros que pueden contener (y por lo tanto apuntar a) la misma dirección”.

Esta flexibilidad es poderosa. Requiere disciplina. Pero es fundamental para el funcionamiento de C. Si comprende esto, comprenderá un concepto central de gestión de memoria en C.