Ads 468x60px

Perfil

viernes, 18 de enero de 2013

Ejemplos basados en arreglos


Acceso a componentes del arreglo.

El acceso a componentes se realiza vĂ­a indirecciĂłn de un puntero constante que es el nombre del arreglo, con un offset dado por el Ă­ndice del elemento.
Se definen tipos de datos.
typedef int Tipo; /* tipo de item del arreglo */
typedef int Indice; /* tipo del Ă­ndice */
Es práctica usual, definir mediante una constante el tamaño máximo del arreglo
#define MaxEntradas 10
Se definen e inician con valores dos arreglos
Tipo A[MaxEntradas]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Tipo B[MaxEntradas]={ 10,11,12,13,14,15,16,17,18,19};
A las funciones que manipulan arreglos se les suele pasar el arreglo por referencia.

Por ejemplo la funciĂłn que imprime en una lĂ­nea las componentes de un arreglo a.
void mostrar(Tipo *a, Indice inferior, Indice superior)
{
Indice i;
for (i = inferior; i <= superior; i++) printf(" %d ", a[i]);
putchar('\n');
}

Note que el primer argumento de la función también puede escribirse: Tipo a[].

Ejemplos de uso:
mostrar(A, 0, 4); imprime 0 1 2 3 4
mostrar(A+2, 0, 4); imprime 2 3 4 5 6

La manipulaciĂłn de arreglos no suele verificar el rango del Ă­ndice. En el caso de haberse
definido adyacentes los arreglos A y B, la referencia a A[12] está accesando efectivamente a
B[2], por eso se muestra un 12; pero es un error por acceso fuera de rango.
printf(" %d \n", A[12]); imprime 12
printf(" %d \n", B[-2]); imprime 8
printf(" %d \n", A[-1]); imprime cualquier cosa que estuviera almacenada antes de A
printf(" %d \n", 1[-1+B] ); imprime 10
printf(" %d \n", -1[B] ); imprime -11 (es una referencia correcta)
Similares errores pueden generarse accesando componentes indireccionando vĂ­a puntero:
printf(" %d \n", *(A+12)); imprime 12
printf(" %d \n", *(-2+B)); imprime 8
Los ejemplos anteriores ilustran que el acceso a componentes de un arreglo se efectĂşa mediante
indirecciĂłn con el puntero que es el nombre del arreglo.
La expresiĂłn: A[c] se interpreta como el contenido de la direcciĂłn:
A + c*(tamaño del tipo del arreglo).
Donde A es la direcciĂłn de la primera componente del arreglo.
Empleando el lenguaje:
A[c] equivale a: *(A+c) y A es equivalente a &A[0].