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
- Error de uno.
i <= nleea[n], uno más allá del final. No hay caída garantizada ni aviso. - Declaración demasiado pequeña.
int a[10]con 11 valores sobrescribe memoria vecina. - Acumulador sin inicializar.
int suma; suma += a[i];arranca de basura. - Sembrar un máximo con 0. Funciona con entrada positiva y falla con toda negativa — el test que lo caza está en Máximo de un array.
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²).