Punteros y memoria

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++

C
Ejecutar →
main.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;
}
Resultado de la ejecución
row 0=6
row 1=15
C++
Ejecutar →
main.cpp
#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';
    }
}
Resultado de la ejecució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.

C

La propiedad y la liberación de la memoria dependen por completo del programador.

C++

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.

Todos los retos