
Memoria dinámica? Que es?
Si estás leyendo esto, es muy probable que la gran mayoría de tus programas hayas conocido la cantidad de datos a almacenar de antemano. Sin embargo en problemas reales, la mayoría de las ocasiones, desconocemos la cantidad de datos a almacenar, y tenemos que echar a andar diversos recursos que los lenguajes de programación nos ofrecen, para lidiar con este problema.
Uno de ellos, es la asignación dinámica de memoria, que nos permite asignar bloques de memoria, en tiempo de ejecución, para almacenar datos en dichos bloques.
Bueno ya se que es, ahora como la programo?
C++ nos brinda el operador new y delete que asignan y liberan la memoria de una zona denominada free store (Almacén libre). A diferencia de malloc() y free() en C, new y delete de C++ implementados como operadores y son mas fiables ya que el compilador realiza verificación de tipos cada vez que un programa aloja memoria.
Existen dos maneras muy sencillas de implementar matrices dinamicas en C/C++, la primera es creando un arreglo dinamico, y dentro de cada casilla del arreglo dinamico, creamos otro arreglo dinamico, simulando una matriz dinamica. La segunda forma, es utilizando el concepto de filas de orden mayor (row major order) o columnas de orden mayor (column major order).
Opcion 1: Arreglo de arreglos dinamicos
Un arreglo dinámico, es un arreglo comun y corriente, cuya capacidad va incrementando conforme se le van agregando datos, asi que puede ser tan grande como la memoria lo permita.
Si creamos un arreglo dinamico, en cada una de las casillas, de un arreglo dinamico, entonces obtendremos una matriz dinámica
ā
Declaración de una matriz en C++
int myMatriz1[10][5]; float myMatriz2[5][10]; string myMatriz3[15][15]; bool myMatriz4[1000][3];
Veamos rápidamente que representa cada línea del código anterior.
Línea 1
Esta línea contiene la declaración de una matriz llamada myMatriz1 que tendrá 10 filas y 5 columnas y cada una de las 50 casillas tendrá datos de tipo entero.
Línea 2
Esta línea contiene la declaración de una matriz llamada myMatriz2 que tendrá 5 filas y 10 columnas y cada una de las 50 casillas tendrá datos de tipo flotante.
Línea 3
Esta línea contiene la declaración de una matriz llamada myMatriz3 que tendrá 15 filas y 15 columnas (una matriz cuadrada) y cada una de las 225 casillas tendrá datos de tipo string.
Línea 4
Esta línea contiene la declaración de una matriz llamada myMatriz4 que tendrá 1000 filas (sí, leíste bien) y 3 columnas y cada una de las 3000 casillas (también leíste bien, tres mil casillas) tendrá datos de tipo booleano.
Ya que está claro cómo se declara una matriz, vamos a inicializarla, es decir darle un valor a cada casilla, según su tipo de dato.
¿Cómo inicializar una matriz en C++?
En cuanto tenemos declarado una matriz, es posible asignarle valores a cada una de sus casillas, evidentemente estos valores deben coincidir con el tipo de dato que le asignamos a dicha matriz
Voy a mostrar a continuación formas distintas de inicializar una matriz, todas son validas, ya es cuestión de nuestras necesidades y conocimientos determinar cuál es útil y en qué momento. Veamos entonces:
Forma 1 de declarar una matriz
int myMatriz1[2][2] = {{1,2},{3,4}};
Aquí hemos declarado una matriz de tipo int de dos filas y dos columnas y la hemos inicializado con diferentes valores. El valor inicial corresponde a la casilla 0,0 (fila cero, columna cero) y tiene el valor de 1, en la fila cero columna uno tenemos el valor de 2, en la fila uno columna cero el valor de 3 y finalmente en la fila uno columna uno el valor de 4. Es importante notar que el primer tanto la fila como la columna comienzan desde cero y no desde uno, por esto la primer casilla corresponde a la fila y columna cero.
¡Bien! Ya sabemos cómo declarar una matriz en C++, sin embargo, aún no sabemos cómo acceder a los datos que estas contienen. Veámoslo:
Obtener el valor de una casilla específica
Para acceder al valor de una casilla nuevamente haremos uso de los corchetes, pero esta vez no para declarar tamaños (porque eso ya lo hicimos) sino para indicar posiciones (fila y columna).
int myMatriz1[2][2] = {{1,2},{1,1}}; //Matriz con 4 elementos int fila1Casilla1 = myMatriz[1][1]; //Para acceder a la casilla 1,1 se usan dichos indices int primerNumero = myMatriz[0][0]; //La primer casilla siempre será la de la fila 0 columna 0
Como podemos ver, para acceder a un valor específico conociendo el índice de la casilla, solo basta con escribir dicho índice entre los corchetes "[][]", recuerda que el índice comienza desde cero, así por lo tanto en una matriz de vector de 2 por 2 (como el ejemplo), el último elemento está en el índice 1 y el primer elemento en el índice 0.




