Abrir el simulador
Programas en C línea a línea con la pila, el montón y a dónde apunta cada puntero.
malloc.
Lo que vas a aprender
- Qué es una dirección de memoria y un puntero.
- Los operadores
&y*. - La diferencia entre paso por valor y por referencia.
- La aritmética de punteros y su relación con los vectores.
- Cómo funcionan la pila y el montón,
mallocyfree.
Cómo se usa el simulador
- Elige un programa: paso por valor, paso por referencia, aritmética de punteros, vector dinámico o matriz dinámica.
- Avanza con ⏮, ◀, ▶ Ejecutar, ▶ y ⏭, o arrastra el deslizador.
- Se ven el código con la línea actual, la pila con un marco por función, el montón y la salida del programa.
- Lo que acaba de cambiar se resalta. Pasa el ratón (o toca) un puntero para ver a qué apunta.
Fundamentos teóricos
Direcciones y punteros
Cada variable ocupa un lugar en la memoria con una dirección. Un puntero es una variable que guarda una dirección.&x: la dirección dex.*p: la variable a la que apuntap(desreferenciar).- En una declaración,
int *psignifica “p es un puntero a int”.
Paso por valor y por referencia
En C los argumentos se pasan por valor: la función recibe una copia.cambia(&n, &m).
Aritmética de punteros
Sumar 1 a un puntero avanza un elemento, no un byte:p + 1 avanza sizeof(*p) bytes (4 en un int típico). Por eso:
El nombre de un vector se comporta como un puntero a su primer elemento.
La pila
Guarda las variables locales. Cada llamada a una función crea un marco encima; al terminar, se destruye. Por eso nunca hay que devolver la dirección de una variable local.El montón (heap)
Memoria que se pide en tiempo de ejecución y sigue existiendo hasta que se libera:Ejemplos resueltos
Ejemplo 1 · ¿Por qué no intercambia?
Ejemplo 1 · ¿Por qué no intercambia?
cambia(n, m) intercambia sus copias, que desaparecen al volver a main. cambia(&n, &m) recibe las direcciones y, con *n y *m, escribe en las variables de main.Ejemplo 2 · Aritmética
Ejemplo 2 · Aritmética
Con
int v[] = {10, 20, 30}; int *p = v;: *(p + 2) vale 30. Si p está en la dirección 1000, p + 2 está en 1008.Ejemplo 3 · Matriz dinámica
Ejemplo 3 · Matriz dinámica
Una matriz de
f × c se puede pedir como un vector de f punteros, cada uno con su fila de c enteros. Se libera al revés: primero cada fila y luego el vector de punteros.Experimenta con el simulador
1
Valor y referencia
Ejecuta los dos programas de intercambio y compara los marcos de la pila.
2
Aritmética
En el programa de aritmética, mira cuánto cambia la dirección del puntero en cada
p++.3
Montón
En el vector dinámico, observa qué queda en el montón cuando termina la función que hizo el
malloc.Errores frecuentes
- Usar un puntero sin inicializar (apunta a cualquier sitio).
- Desreferenciar NULL.
- Olvidar el
free(fuga de memoria) o hacerlo dos veces. - Usar memoria después del
free(puntero colgante). - Devolver la dirección de una variable local.
- Olvidar
sizeofen elmalloc.
Herramientas relacionadas
Recursión en C
La pila de llamadas.
ArrayList y lista enlazada
Nodos enlazados con referencias.
Conversor de bases
Direcciones en hexadecimal.