Arreglos: memoria contigua y aritmética de apuntadores
lunes 17 de agosto · 13:00–14:15 · hace 5 días
GUÍA 17-08-26 Estructuras de Datos
CN122 · lunes 17/08/2026 · 13:00-14:15 · Sesión 3
Arreglos: memoria contigua y aritmética de apuntadores
QUÉ ES REALMENTE UN ARREGLO EN C
Un arreglo es un bloque contiguo de memoria y un nombre que apunta a su primer elemento. No hay metadatos: C no guarda el tamaño, no verifica límites y no sabe dónde termina. Todo eso es responsabilidad del programador.
LA EQUIVALENCIA FUNDAMENTAL
- a[i] es idéntico a *(a + i). El compilador traduce el primero al segundo.
- a + i no suma i bytes: suma i·sizeof(tipo) bytes. La aritmética de apuntadores está escalada por el tipo.
- Consecuencia curiosa pero real: a[i] == i[a], porque la suma es conmutativa.
POR QUÉ EL ACCESO ES O(1)
La dirección del elemento i se calcula con una multiplicación y una suma: base + i·tamaño. No hay que recorrer nada. Esa es la única razón por la que el arreglo es la estructura más rápida para acceso aleatorio, y también la razón de todas sus limitaciones.
LO QUE SE PAGA A CAMBIO
- Tamaño fijo en tiempo de compilación (salvo VLA o memoria dinámica).
- Insertar o borrar en medio cuesta O(n) por el corrimiento.
- Necesita un bloque contiguo libre; con memoria fragmentada puede fallar aunque haya espacio total suficiente.
EL ARREGLO DECAE A APUNTADOR
Al pasar un arreglo a una función, se pasa solo la dirección base. Dentro de la función sizeof(a) devuelve el tamaño de un apuntador, no del arreglo. Por eso toda función que recibe un arreglo debe recibir también su longitud.
- void imprimir(int a[], int n) · el [] es azúcar sintáctica de int *a.
ERRORES CLÁSICOS
- Escribir en a[n] — está fuera del arreglo y C no lo impide; corrompe memoria en silencio.
- Usar sizeof(a)/sizeof(a[0]) dentro de una función: da 1 o 2, no la longitud.
PRÁCTICA
Implementar búsqueda del máximo, inversión in situ y rotación de un arreglo, todas recibiendo la longitud como parámetro.