Los arreglos multidimensionales en C y C++
En esta lección vas a recorrer una matriz de dos dimensiones y calcular la suma de los elementos de cada fila.
Introducción
Un arreglo de dos dimensiones se puede imaginar como una tabla de filas y columnas. Tanto en C como en C++ se guarda de forma continua en memoria, fila por fila (row-major): primero toda la primera fila, luego la segunda, y así sucesivamente.
Puntos importantes
- Un puntero solo debe apuntar a un objeto que todavía existe, del tipo correcto, o valer null.
- Cada zona de memoria reservada debe liberarse exactamente una vez.
- Deja claro qué función es dueña de la memoria (ownership) y qué datos solo se leen (const).
Mira cómo funciona
Señala una celda para ver su fila, su columna y su lugar en memoria, donde todas las filas se guardan una tras otra.
Ejemplos de código C y C++
#include <stdio.h>
int main(void) {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int row = 0; row < 2; ++row) {
int total = 0;
for (int column = 0; column < 3; ++column) total += matrix[row][column];
printf("row %d=%d\n", row, total);
}
return 0;
}
row 0=6
row 1=15
#include <array>
#include <iostream>
int main() {
std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
for (std::size_t row = 0; row < matrix.size(); ++row) {
int total = 0;
for (int value : matrix[row]) total += value;
std::cout << "row " << row << '=' << total << '\n';
}
}
row 0=6
row 1=15
Comparación entre C y C++
Dos bucles anidados recorren la matriz: el bucle exterior pasa por cada fila y el interior suma los elementos de esa fila en la variable total. En C, al pasar un arreglo de dos dimensiones a una función, hay que indicar el tamaño de todas las dimensiones salvo la primera. En C++, std::array guarda el tamaño en el propio tipo y ofrece el método at(), que comprueba que el índice sea válido.
La propiedad y la liberación de la memoria dependen por completo del programador.
Los contenedores y RAII liberan automáticamente los recursos cuando el objeto llega al final de su vida.
Ejercicios de práctica
Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.
- Prueba con punteros nulos y con fallos al reservar memoria.
- Ejecuta el programa con AddressSanitizer y UndefinedBehaviorSanitizer para detectar errores de memoria.
- Deja claro qué puntero es dueño de la memoria y cuál solo sirve para leer.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
- Row Sums Add up every row of a grid. Fácil
- Minesweeper Neighbor Counts Annotate a rectangular board. Intermedio