Cuando trabajamos con colecciones de datos en C, una de las formas más útiles y eficientes de organizarlos es mediante los arrays, también conocidos como vectores o arreglos. Un array nos permite reservar en memoria un bloque contiguo de posiciones, cada una destinada a almacenar un dato del mismo tipo, y acceder a ellas mediante un índice. Esto simplifica enormemente el manejo de múltiples valores bajo un único identificador, evitando la necesidad de declarar variables individuales para cada dato.
Para declarar un array en C, indicamos el tipo de dato que almacenará, seguido del nombre del array y entre corchetes el número de elementos que queremos reservar. Por ejemplo, si queremos guardar ocho edades, escribiremos:
int edades[8];
Esto crea un espacio en memoria para ocho enteros contiguos, accesibles desde edades[0] hasta edades[7]. Es importante recordar que los índices en C comienzan en cero, por lo que el último elemento está en la posición número siete si el array tiene ocho elementos.
Podemos asignar valores a posiciones específicas del array usando el índice, como en:
edades[2] = 14;
Y también podemos realizar operaciones con los elementos, por ejemplo:
int resultado = edades[2] + edades[3];
Sin embargo, cuando declaramos un array, sus elementos no se inicializan automáticamente. La memoria reservada puede contener valores residuales, por lo que es recomendable inicializar el array al declararlo, usando una sintaxis inline:
int edades[8] = {1, 2, 3, 4, 5, 6, 7, 8};
Otra forma común de inicializar un array es mediante un bucle for que pida al usuario que introduzca los valores para cada posición:
for (int i = 0; i < 8; i++) {
printf("Introduce la edad %d: ", i + 1);
scanf("%d", &edades[i]);
}
Aquí, usamos i + 1 para mostrar al usuario un conteo más natural, comenzando en 1, aunque internamente el índice empieza en 0.
Un aspecto importante es que el tamaño del array debe conocerse en tiempo de compilación cuando declaramos arrays estáticos, por lo que debemos especificar el número de elementos al definirlo. Esto permite al compilador reservar el espacio adecuado en memoria. Sin embargo, existe una característica llamada VLA (Variable Length Arrays), introducida en el estándar C99, que permite declarar arrays cuyo tamaño se determina en tiempo de ejecución mediante una variable. Por ejemplo:
int TAM;
printf("¿Cuántos elementos quieres introducir? ");
scanf("%d", &TAM);
int edades[TAM];
Esto es muy útil para programas que necesitan manejar colecciones de tamaño variable, aunque no está soportado en todas las versiones de C ni en todos los compiladores.
Cuando queremos pasar un array a una función, debemos tener en cuenta que en C los arrays se tratan como punteros al primer elemento. Esto significa que el identificador del array es en realidad la dirección de memoria donde comienza la secuencia de elementos. Por ello, al pasar un array a una función, no se copia todo el contenido, sino que se pasa un puntero a la memoria original, lo que es más eficiente en términos de tiempo y uso de memoria.
Para ilustrar esto, podemos definir una función que calcule la media de un array de enteros. La función recibirá un puntero al primer elemento del array y el número de elementos que contiene:
float media(int edades[], int tam) {
int suma = 0;
for (int i = 0; i < tam; i++) {
suma += edades[i];
}
return (float)suma / tam;
}
Aquí, aunque escribimos int edades[] en la declaración de la función, internamente se trata como int *edades. Es importante pasar también el tamaño del array, ya que la función no puede deducirlo a partir del puntero.
Podemos usar esta función de la siguiente manera:
int main() {
int edades[8];
for (int i = 0; i < 8; i++) {
printf("Introduce la edad %d: ", i + 1);
scanf("%d", &edades[i]);
}
float resultado = media(edades, 8);
printf("La media es %.2f\n", resultado);
return 0;
}
La aritmética de punteros es la base que permite acceder a los elementos del array mediante índices. Cuando escribimos edades[i], el compilador calcula la dirección de memoria sumando i veces el tamaño del tipo de dato al puntero base edades. Esto nos da una gran flexibilidad para manipular arrays y trabajar con funciones que reciben punteros.
En resumen, los arrays en C son estructuras fundamentales para manejar colecciones de datos de forma eficiente. Entender su declaración, inicialización, el uso de índices, la diferencia entre arrays estáticos y variables, y cómo se pasan a funciones mediante punteros, nos permite construir programas más flexibles y potentes.