Tutorial de programación en C para Linux Parte 7: Matrices
Ya hemos hablado del concepto de variables en la programación en C(aquí y aquí). Para refrescarlo rápidamente, una variable es algo que puede contener un valor de un tipo determinado: puede ser un número entero, un carácter o incluso una coma flotante. Sin embargo, las variables tienen una limitación: sólo pueden contener un único valor en un momento dado.
Esto significa que si quieres contener varios valores, tendrás que manejar igual número de variables. Por ejemplo, si quieres que un programa acepte 10 valores enteros del usuario y luego los emita, entonces lo escribirás de esta manera:
#include <stdio.h>
int main()
{
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;
printf("Enter 10 integer values\n");
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
scanf("%d",&d);
scanf("%d",&e);
scanf("%d",&f);
scanf("%d",&g);
scanf("%d",&h);
scanf("%d",&i);
scanf("%d",&j);
printf("You entered the following values:\n");
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
printf("%d\n",d);
printf("%d\n",e);
printf("%d\n",f);
printf("%d\n",g);
printf("%d\n",h);
printf("%d\n",i);
printf("%d\n",j);
return 0;
}
O de la siguiente manera:
#include <stdio.h>
int main()
{
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;
printf("Enter 10 integer values\n");
scanf("%d %d %d %d %d %d %d %d %d %d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j);
printf("You entered the following values:\n");
printf("%d %d %d %d %d %d %d %d %d %d\n",a,b,c,d,e,f,g,h,i,j);
return 0;
}
El segundo enfoque puede ser ligeramente mejor si lo comparas en términos de líneas de código escritas, pero sigue habiendo una forma mejor, y es utilizar una matriz de enteros.
Sí, si es necesario mantener varios valores del mismo tipo, debes optar por una matriz. Así es como se define una matriz de enteros capaz de contener 10 valores:
int arr[10]
Aquí, «int» se refiere al tipo de valores que almacenará la matriz «arr». El número 10 entre corchetes indica que la capacidad de ‘arr’ es de 10 valores. Ahora, aquí hay un trozo de código que utiliza este array:
#include <stdio.h>
int main()
{
int arr[10],i;
printf("Enter 10 integer values\n");
for(i=0;i<10;i++)
scanf("%d",&(arr[i]));
printf("You entered the following values:\n");
for(i=0;i<10;i++)
printf("%d\n",arr[i]);
return 0;
}
Ten en cuenta que ya hemos hablado de las funciones scanf y printf en uno de nuestros tutoriales anteriores, así que puedes consultar esos artículos en caso de que quieras saber más sobre ellas.
Volviendo a las matrices, habrás observado que el bucle «for» del código anterior comienza con i=0. Esto se debe a que los subíndices de las matrices (el número que hay dentro de los corchetes) siempre comienzan desde cero. Así que aquí, en nuestro caso, arr[0] se refiere al primer valor introducido por el usuario, arr[1] se refiere al segundo valor, y así sucesivamente hasta arr[9] que se refiere al décimo valor.
También cabe mencionar que puedes acceder fácilmente a la dirección de memoria de cada valor almacenado en el array. Esto puede hacerse utilizando el nombre de la matriz, que en este caso es ‘arr’. Por tanto, si utilizas sólo ‘arr’ en el código, no es más que la dirección de memoria del primer elemento.
Del mismo modo, si quieres acceder a la dirección de memoria del segundo elemento, sólo tienes que utilizar ‘arr+1’. Para el tercer elemento, utiliza ‘arr+2’, y así sucesivamente. El siguiente fragmento de código y su salida deberían darte una mejor idea.
#include <stdio.h>
int main()
{
int arr[10],i;
printf("The address of first and second values are: %u %u\n", arr, arr+1);
return 0;
}
Y aquí está la salida:
The address of first and second values are: 2904035888 2904035892
Como puedes ver, hay una diferencia de 4 bytes en estas direcciones, porque un valor entero ocupa 4 bytes en mi sistema.
Conclusión
En este tutorial hemos hablado de los fundamentos de las matrices. Ten en cuenta que sólo hemos dado el ejemplo de una matriz de enteros. También puedes tener matrices de otros tipos, como de caracteres. Prueba los ejemplos que hemos utilizado en este tutorial, y haznos saber en la sección de comentarios de abajo si tienes alguna duda o consulta.