En C, la memoria se gestiona principalmente en dos áreas: el Stack (Pila), donde viven las variables locales de tamaño fijo y gestión automática; y el Heap (Montículo), una zona libre y grande donde el programador decide cuándo reservar y liberar memoria manualmente.

Imagen 24. Organización de la memoria RAM: Stack vs Heap
Diagrama de la RAM: Observa cómo el Stack crece hacia direcciones bajas y el Heap hacia direcciones altas, con un espacio libre en medio.
Para usar el Heap necesitamos la librería <stdlib.h>. La función principal es "malloc" (memory allocation), que reserva un bloque de bytes consecutivos. Es vital liberar esta memoria con "free" para evitar fugas de memoria (memory leaks).

Imagen 25. Comportamiento de realloc en memoria
Visualización de realloc: Si hay espacio contiguo, expande el bloque. Si no, busca un nuevo espacio, copia los datos y libera el anterior automáticamente.
Los punteros son variables que guardan direcciones numéricas. Lo interesante es que sumar 1 a un puntero no suma 1 byte, sino "sizeof(tipo)" bytes. Si un puntero int apunta a la dirección 1000, "ptr + 1" apuntará a 1004 (en arquitecturas de 32 bits).
El verdadero poder de los punteros surge cuando una estructura contiene un puntero a otra estructura de su mismo tipo. Esto permite crear "Nodos" que se enlazan entre sí, formando cadenas de datos infinitas (listas, árboles).