Arreglos
Una exploración sobre los arreglos en lenguaje C y su uso como estructuras de datos, así como ventajas y desventajas.
¿Qué son los arreglos?
Los arreglos son la estructura no primitiva (es decir que no es un dato) más básica que existe, su configuración es una representación de datos de un mismo tipo contiguos (uno en la posición inmediatamente siguiente al otro) en la memoria RAM. Podemos identificar los componentes de un arreglo como:
- Dirección.
- Es decir la posición dentro de la RAM en la que se está alojado el arreglo, sin importar el número de datos, siempre deberemos tener en consideración la ubicación del primer dato.
- Tipo.
- Este nos indicará el espacio que ocupará cada dato del arreglo en memoria, siendo el mínimo estandarizado de 8 bits, es decir 1 byte.
- Tamaño.
- Necesitamos saber con cuantos elementos cuenta nuestro arreglo para poder saber en donde inicia y termina, es necesario para evitar cualquier tipo de desbordamiento, en este caso out bounding, es decir salir de los límites.
- Identificador.
- Nos permite referenciar a nuestro arreglo dentro de nuestros programas. Debemos recordar que tanto este como el tamaño y el tipo, al momento de compilar "dejan de existir", pues terminan sirviendo simplemente como interpretaciones a tomar en cuenta y el identificador es remplazado por la dirección asignada al arreglo (no reservado en ejecución).

Implementación.
Dentro de lenguaje C, la estructura a seguir para la definición de un arreglo consta de lo siguiente:
tipo identificador[ tamaño ] = { ...datos };
Bajo las siguientes consideraciones:
- El tamaño debe ser un entero positivo.
- El tipo puede ser un tipo primitivo, una unión, enumeración o registro (struct).
- La asignación de datos puede omitirse si se definió un tamaño y viceversa pero no ambos a la vez.
- Si se define un tamaño y se realiza la asignación de datos, el número de ellos debe coincidir con el tamaño.
Podemos ver la implementación de ellos en lenguaje C.
int main() { // Definición de un arreglo de 5 números enteros de 32 bits. int numeros[5] = { 1, 2, 3, 4, 5 }; //Definición de un arreglo de 10 caracteres. char caracteres[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L' }; // Definición de un arreglo de 10 reales de 64 bits. float reales[10]; return 0; }C
Para acceder a la información o modificarla necesitamos hacer uso del operador [], con el nos posicionamos en el "offset" (desplazamiento relativo al origen del arreglo) deseado y podemos modificar o extraer el dato.
Eficiencia.
Los arreglos como estructura de datos tienen grandes ventajas y desventajas, entre las ventajas tenemos:
- Alta eficiencia en la consulta y modificación de información.
- Facilidad de uso e implementación nativa (no requiere librerías, ni siquiera las estándar).
- Conceptos fáciles de enternder y aplicar.
Pero por otro lado:
- Poco eficiente para búsquedas de elementos en concreto.
- Poco flexibles, al ser definidos no podemos cambiar su tamaño.
- Si necesitamos más espacio necesitamos reservar un segmento contiguo completo con la nueva capacidad deseada.
- Poco eficiente uso de memoria, en caso de usar menos memoria de la reservada, estamos desperdiciando espacio.
Tipo de consulta | Eficiencia temporal | Razón |
---|---|---|
Inserción | O(n) | Debe reservar el nuevo espacio necesario y mover todos los datos. |
Búsqueda | O(n) | En el peor de los casos debe recorrer todo el arreglo para encontrar la coincidencia. |
Eliminación | O(n) | Debe extraer el dato y mover a los huecos el resto de datos. |
Consulta | O(1) | Está indexado, así que es muy rápido acceder a un dato concreto. |
Conclusión.
Por su fácil implementación y concepto, los arreglos son la estructura de datos por excelencia cuando inicias en el mundo de la programación, sin embargo saber cuales son sus limitaciones y aprender sobre otras que tengan características diferentes (mejores unas, peores otras) y sobre todo aplicarlas en el momento correcto, es una de las grandes habilidades que debe tener un desarrollador..