#include <iostream>

int main( ) {
   int* p = new int[3];          // pedir un arreglo de tres enteros que se asignará en el almacenamiento libre
                                 // p recibirá la dirección a su primer elemento

   *p = 4;                       // modificando el valor del primer elemento del arreglo
   std::cout << *p << "\n";      // debe imprimir 4
   std::cout << p[0] << "\n";    // aunque p es un apuntador y no un arreglo, notacionalmente podemos tratarlo como si él fuera el arreglo

   p[0] = 7;
   p[1] = 8;
   p[2] = 9;
   std::cout << p[0] << " " << p[1] << " " << p[2];

   delete[] p;                   // liberar el arreglo apuntado por p (al apuntador p en sí no le pasará nada, sólo al arreglo)
                                 // si no liberamos la memoria solicitada con new, permanecerá ocupada hasta que el programa termine
                                 // ¡¡importante!!: es un error fatal liberar algo que ya había sido liberado
}
