Fundamentos

Arrays en C++: la imagen completa

Respuesta corta: int a[5] reserva cinco casillas consecutivas de int y las llama a[0] … a[4]. El tamaño se fija en compilación y C++ no comprueba tus índices en ejecución.

La memoria es una fila, no una cuadrícula

Un array es un bloque contiguo. a[3] no es una búsqueda por nombre — es «inicio del bloque más tres elementos de bytes». Por eso indexar es O(1): una multiplicación y una suma.

#include <iostream>
using namespace std;

int main() {
    int a[5] = {10, 20, 30, 40, 50};

    cout << "primero: " << a[0] << endl;
    cout << "tercero: " << a[2] << endl;
    cout << "ultimo:  " << a[4] << endl;
    return 0;
}

No existe a[5]. Escribirlo compila, corre y lee lo que haya justo después en memoria — eso es comportamiento indefinido, no un mensaje de error.

¿Por qué cero?

Porque el índice es un desplazamiento. El primer elemento está a cero casillas del inicio del bloque. Los lenguajes que empiezan en 1 tienen que restar en cada acceso; C++ traslada esa resta a tu código, así que en ejecución es gratis.

Tamaño: elige un techo, no el número exacto

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int a[100];                 // declara un techo
    for (int i = 0; i < n; i++) cin >> a[i];

    cout << "leidos " << n << " valores" << endl;
    return 0;
}

En C++ no puedes redimensionar un array. En código real declaras un techo generoso (como aquí) o usas std::vector, que crece. Compáralos en vector frente a array.

Los tres patrones que merece la pena memorizar

1. Suma — inicializa el acumulador a cero.

#include <iostream>
using namespace std;

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    int suma = 0;
    for (int i = 0; i < 5; i++) suma += a[i];
    cout << suma << endl;   // 15
    return 0;
}

2. Máximo — siembra con el primer elemento, nunca con cero.

#include <iostream>
using namespace std;

int main() {
    int a[4] = {-9, -3, -7, -1};
    int mejor = a[0];
    for (int i = 1; i < 4; i++) {
        if (a[i] > mejor) mejor = a[i];
    }
    cout << mejor << endl;   // -1, no 0
    return 0;
}

3. Contar — un contador por categoría.

#include <iostream>
using namespace std;

int main() {
    int a[6] = {4, 7, 10, 3, 8, 1};
    int pares = 0, impares = 0;
    for (int i = 0; i < 6; i++) {
        if (a[i] % 2 == 0) pares++;
        else impares++;
    }
    cout << "pares " << pares << ", impares " << impares << endl;
    return 0;
}

Arrays bidimensionales: filas de filas

#include <iostream>
using namespace std;

int main() {
    int g[3][2] = {{1, 2}, {3, 4}, {5, 6}};

    for (int f = 0; f < 3; f++) {
        for (int c = 0; c < 2; c++) {
            cout << g[f][c] << " ";
        }
        cout << endl;
    }
    return 0;
}

El primer índice es la fila, siempre. Invertirlos transpone tus datos en silencio — el bug que ejercita Transponer una matriz.

Bugs que no se anuncian

Practica: Máximo de un array, Contar pares e impares, Sumar una matriz. Siguiente: la notación Big O explica por qué un bucle anidado sobre este array es O(n²).