Ads 468x60px

martes, 15 de enero de 2013

Estructura de datos ejemplos basados en arreglos


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].


0 comentarios:

Publicar un comentario en la entrada

Añade tu Comentario :)