En la práctica es frecuente que enfrentemos problemas cuya solución sería muy difícil de hallar si utilizáramos tipos simples de datos para resolverlos.
Es decir, datos que ocupan una sola casilla de memoria como los enteros o flotantes.
Sin embargo, muchos de estos problemas se podrían resolver fácilmente si aplicaramos en cambio tipos estructurados de datos, los cuales ocupan un grupo de casillas de memoria y se identifican con un nombre.
Array
Un arreglo unidimensional permite almacenar N elementos del mismo tipo (enteros, reales, caracteres, cadenas de caracteres, etc.) y acceder a ellos por medio de un índice. En los arreglos unidimensionales se distinguen dos partes fundamentales: los componentes del índice.
Un vector sería algo muy similar a una lista, ademas que siempre se usan junto con bubles. En C, un array unidimensional se declara como:
Sintaxis
//Aqui solo lo declaras tipo nombre[tamaño]; //Aqui solo lo declaras y le das valores tipo nombre[tamaño] = {valor1, valor2, valor3 ...};
En C, el primer elemento de un array es el que posee el índice 0, por lo tanto, un array de 20 elementos posee sus elementos numerados de 0 a 19.
Sin embargo, el lenguaje C no comprueba el tamaño de los arrays. ¡Porque C nos odia!
Aquí unas notas importantes para las próximas lecciones incluso si ahora no lo entiendes.
Nota:
- Para usar un array como parámetro de una función basta con nombre
- Para el prototipo de la misma funcion deberia ponerse nombre[]
Por lo cual, podemos escribir:
Aquí estan unos ejemplos:
float vector[3]={-3.0,5.7,-7.5}; int secuencia[3] = {0,1,2};
También es posible inicializar arrays sin ponerles el tamaño, el compilador cuenta el número de caracteres de inicialización y reserva el tamaño necesario de forma automática. Por ejemplo:
float vector[]={-3.0,5.7,-7.5}; char cadena[]=“Esto es una cadena”;
Matriz
Un conjunto de arrays o arreglos.
Así de simple : )
La declaración de arrays de más de una dimensión se realiza de forma parecida a la de una dimensión, la sintaxis de la declaración de un array multidimensional es:
//Aqui solo lo declaras tipo nombre[tamaño1][tamaño2]...[tamañoN]; //Aqui solo lo declaras y le das valores tipo nombre[tamaño][tamaño2] = {{var1,var2..},{var3,var4...},{var5,var6...}};
String
Una cadena, también llamada string, es un tipo especial de array unidimensional. Una cadena es un array de caracteres (char) que termina con un carácter especial (el carácter ‘\0’).
En esto el string es diferente a un arreglo de char, que tiene un final.
Es por ello, que la declaración de una cadena de caracteres se realiza exactamente igual que la declaración de un array unidimensional de caracteres:
//Aqui solo lo declaras char cadena[tamaño];
Como toda cadena debe terminar en el carácter ‘\0’, es por ello que si se quiere usar una cadena de 20 caracteres, debe declararse de tamaño 21 (20 caracteres + carácter terminador).
Arrays como Punteros
Otra manera de acceder a una parte contigua de la memoria, en lugar de con un arreglo, es con un puntero.
Ya que estamos hablando acerca de las cadenas, las cuales se componen de caracteres, estaremos usando punteros a caracteres, o más bien:
char *string;
Después hacemos que apunte a la dirección de memoria del array
string = &(array[0]);
Ahora estas sentencias son iguales:
array[7]; *(string+7);
Existe una estrecha relación entre los punteros y los arrays. Consideremos el siguiente fragmento de código:
¡Ambos son exactamente igual para la máquina!
char str[80],*p;
p=str; |
int str[80],*p;
p=&str[4]; |
Este fragmento de código pone en la variable puntero p la dirección del primer elemento del array str. Entonces, es posible acceder al valor de la quinta posición del array mediante str[4] y *(p+4) (recuerda que los índices de los arrays empiezan en 0).
Esta estrecha relación entre los arrays y los punteros queda más evidente si se tiene en cuenta que el nombre del array sin índice es la dirección de comienzo del array, y, si además, se tiene en cuenta que un puntero puede indexarse como un array unidimensional, por lo cual, en el ejemplo anterior, podríamos referenciar ese elemento como p[4].
Notación |
|
Vector[x]; | *(Vector + x); |
Vector[x][y]; | *(*(Vector+x) + y); |
Vector[x][y][z]; | *(*(*(Vector+x) + y) + z); |
Sin embargo, los punteros sólo tienen una dirección, no pueden contener todos los caracteres de una matriz de caracteres. Esto significa que cuando usamos un char * para realizar un seguimiento de una cadena, debe existir el arreglo de caracteres que contiene la cadena.
Funciones – Arrays
El lenguaje de programación C utiliza parámetros por referencia para pasar los arreglos a las funciones. Cualquier modificación que se realice a los arreglos á las funciones afecta su valor original.
En la llamada a la función sólo se debe incluir el nombre del arreglo, que es un apuntador. No se deben incluir los corchetes porque ocasionan un error de sintaxis.
void NombreFuncion(NombreArray){ ... }
Hemos usado algo pero no hemos tenido de explicarlo, los punteros, así que…
![]() |
![]() |
![]() |