Como decia Rambus es algo muy utilizado para declarar vectores multidimensionales de forma dinamica (matrices de más de una dimensión).
m0skIt0 te esplica bien como funciona. Voy a intentar esplicarte para qué:
Imagina que quieres crear una matriz. Lo primero que se nos ocurre normalmente es declarar algo del tipo:
Pero tendriamos que especificar el tamaño de la matriz o vector. En este caso 125;
Cuando esto no esta claro (el vector no sabemos cunto va a ocupar), utilizamos vectores dinamicos que no son más que un puntero que nos indicaria el comienzo (la dirección inicial) de los datos.
Sumando y restando a ese puntero nos podemos mover a través de los distintos elementos. Por supuesto, hay que utilizar funciones para la gestion de memoria para inicializar y cambiar el tamaño de la memoria reservada a dicho array (por ejemplo malloc).
Cuando queremos utilizar una matriz bidimensional del tipo
podemos considerarlo como un vector de vectores. Es decir un vector cullo tipo de dato es un vector siempre del mismo tamaño.
Así aparece el concepto de filas y columnas. En este tipo de array, cada fila es un array de una única dimensión y la columna indica el elemento dentro de ese array unidimensional.
La matriz anterior define 125 vectores de 125 elementos cada uno.
Si las filas no tienen todas el mismo número de elementos nos encontramos con el mismo problema de antes y podemos recurrir también a los vectores dinámicos. Asi es como surgen los punteros a puntero. Tenemos que inicializar un puntero (un vector dinámico) que indique el comienzo de una zona de memoria donde haya otros punteros (otros vectores dinámicos). La declaración sería así.
Para inicializar este puntero necesitarías enlazar llamadas a funciones de inicialización de memoria;
Si quisieramos, añadir otra dimensión, tendriamos que crear un vector que apunte a otra seríe de vectores que a su vez apunten a otros vectores que apuntan a los datos en cuestión. Sería:
y así hasta el infinito.
El uso de arrays dinamicos es más dificil pero mucho más versatil y rápido que el uso de arrays estáticos. Por eso se suele utilizar para la creacción de estructuras complejas como pilas, bufferes circulares, etc.. o en el uso de técnicas de transacción rápida de memoria como el doble buffering.
Para entender realmente esto (para mi una de las cosas más bonitas del C/C++ busca referencias sobre la creacción y uso de vectores dinámicos y sobre la inicialización de estos con funciones como malloc;
Un saludo y espero no haber aburrido a nadie