UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

5.12. Actividades

5.12.1. Arrays como casos especiales de punteros

Plan de trabajo

Supón que tienes una declaración como ésta:

int table[] = {10, 20, 30, 40, 50};

Si imprimes table[0], obtendrás el valor 10. Ahora bien, ¿qué pasa si imprimes el valor *table? ¿Imprimirá algo o dará error? Si crees que dará un error porque table es un array y no un puntero, te equivocas; el nombre de un array es tratado en C como un puntero. Si imprimes *table, obtendrás también 10.

Puedes hacer que un puntero apunte al primer elemento de un array asignando simplemente el nombre del array a la variable puntero. Si un array es referenciado por un puntero, podrás acceder a los elementos en el array con ayuda del puntero, como muestra el siguiente ejemplo:

#define SIZE 10
char *ptr_char;
char chars[SIZE];
ptr_char = chars;

El nombre del array es un atajo de acceder a la dirección del primer elemento del array. Siguiendo con el ejemplo, la última línea podría sustituirse por ptr_char = &chars[0];.

Así mismo, puedes incrementar o decrementar un puntero. Si lo incrementas, la dirección que tiene como valor incrementa: ptr_char++; Esto no significa que el puntero se incremente siempre en 1; se incrementa en tantos bytes como tamaño ocupe la variable a la que referencia. De esta manera, chars[2] y *(ptr_char + 2) dan el mismo resultado.

Teniendo esto en cuenta, calculad la media entre los elementos de dos arrays. Se pide para ello que imprimáis por pantalla los elementos de dos arrays y que calculéis e imprimáis la media entre cada par de elementos. Para ello, cread en vuestro entorno de desarrollo un fichero llamado arrays_as_pointers.c, e implementad en él lo siguiente (veréis que es el mismo programa que el de arrays básicos, pero ahora tendréis que enviar el array en forma de puntero):

  1. Una función que imprima por pantalla los elementos de un array de enteros: void print_array(int *array);

  2. Una segunda función que calcule la media entre cada par de elementos de un array y que la vaya imprimiendo por pantalla: void calculate_average(int *array1, int *array2);. Para la primera posición de cada array, sumará los dígitos y los dividirá por dos, y ese resultado lo sacará por pantalla, y así con el resto de posiciones.

  3. Una función main que declare e inicialice dos arrays de 10 enteros con los dígitos que queráis, por ejemplo int array1[] = {1,5,7,3,12,...};, y que haga uso de la primera función para imprimir los arrays y de la segunda para calcular la media.