[C con Clase] Dudas sobre punteros que apuntan a punteros

Javier javiersalvadormarco en gmail.com
Mar Ene 22 21:52:10 CET 2013


Buenas noches chicos,

Este es mi primer mensaje en esta maravilla de comunidad que nos ayuda a perfeccionar nuestras habilidades en el mundo de la programación, así que antes de nada, ¡muchas gracias por todo!

Ahora voy al grano y os expongo mi pregunta, que va relacionada con lo que más me cuesta de entender en el mundo de la programación: los punteros.

Parece que después de mucho machacar el tema he conseguido entender de forma más o menos fiable los punteros que apuntan a funciones u objetos, pero cuando hablamos de punteros que apuntan a punteros o arrays la cosa se me atraganta. Este es el ejemplo que tenéis puesto en la web, en el apartado Operadores II -> Operador Delete


int main() { 
   char *c; 
   int *i = NULL; 
   float **f;  (1)
   int n;
 
   // Cadena de 122 más el nulo:
   c = new char[123];
   // Array de 10 punteros a float:
   f = new float *[10]; (2)
   // Cada elemento del array es un array de 10 float 
   for(n = 0; n < 10; n++) f[n] = new float[10]; (3)
   // f es un array de 10*10 
   f[0][0] = 10.32; 
   f[9][9] = 21.39; 
   c[0] = 'a'; 
   c[1] = 0; 
   // liberar memoria dinámica
   for(n = 0; n < 10; n++) delete[] f[n]; (4)
   delete[] f; (5)
   delete[] c; 
   delete i; 
   return 0; 
}

Entiendo que lo que os he marcado como 1 es la inicialización de un puntero, el f, que va a apuntar a la dirección de memoria de otro puntero, el cual todavía falta por crear.

En la parte marcada como 2, reservamos 10 posiciones de memoria a las que apuntará f, habiendo en cada una de ellas un puntero. Si no estoy equivocado, f en este momento podrá recoger el valor de cada uno de los punteros que hay, pudiendo moverse a través de sus direcciones de memoria para obtener su valor: Ejemplo f[0] recogerá el valor que apunte el puntero de la array 0. ¿Es así? 

Aquí me gustaría hacer una pregunta sobre el tema, y es por qué no se utilizaría para extraer el valor real el parámetro *f[0] si lo que queremos es obtener un valor y no una dirección de memoria. Esto me cuesta un poco de ver, ya que con los punteros que apuntan a objetos se hace de esa forma y con arrays he visto que no.

Pasamos a la parte marcada como 3. Si esto lo entiendo bien, en este momento vamos creando en cada una de las 10 aposiciones en las que teníamos un puntero, un array de 10 floats. Para acceder a estas posiciones bastará con poner por ejemplo: f[3][3], donde el primer corchete desplazaría el puntero que hemos creado en el punto 1, y el segundo corchete los que hemos creado en el 2. ¿Es correcto?

Parte 4. Aquí mi duda radica en el porqué hemos de crear un bucle para liberar todas las posiciones de memoria, si después realizamos la operación 5:  delete[] f. Supongo que esto es un fallo de concepto mío a la hora de entender la reserva de memoria, ya que yo me imaginaba que al hacer    f = new float *[10] reservamos una cantidad de memoria, y después al hacer el bucle   for(n = 0; n < 10; n++) f[n] = new float[10] fragmentábamos parte de esa memoria para asignarla a cada una de las nuevas arrays de floats. Supongo que he mezclado churros con melindras y que cada vez que se utiliza el new se reserva memoria distinta.

Muchísimas gracias por vuestra ayuda chicos. Soy programador de PL/SQL y el mundo orientado a objetos me gusta, pero también me vuelve loco.

¡Un saludo!


Más información sobre la lista de distribución Cconclase