Page 162

3.5 Paso de par´ametros

4 5 6 7

void incrementa( int a[] ) { int i;

8

for (i=0; i<TALLA; i++) a[i]++;

9 10 11

}

12 13 14 15

int main(void) { int i, v[TALLA];

16 17

printf ("Al principio:\n"); for (i=0; i<TALLA; i++) { v[i] = i; printf ("%d: %d\n", i, v[i]); } incrementa(v) ; printf ("Despu´ es de llamar a incrementa:\n"); for (i=0; i<TALLA; i++) printf ("%d: %d\n", i, v[i]); return 0;

18 19 20 21 22 23 24 25 26 27 28

}

F´ıjate en c´ omo se indica que el par´ametro a es un vector de enteros: a˜ nadiendo un par de corchetes a su identificador. En la l´ınea 23 pasamos a incrementa el vector v. ¿Qu´e ocurre cuando modificamos componentes del par´ametro vectorial a en la l´ınea 10? Si ejecutamos el programa obtenemos el siguiente texto en pantalla: Al principio: 0: 0 1: 1 2: 2 Despu´ es de llamar a incrementa: 0: 1 1: 2 2: 3

¡El contenido de v se ha modificado! Ocurre lo mismo que ocurr´ıa en Python: los vectores s´ı modifican su contenido cuando se altera el contenido del respectivo par´ametro en las llamadas a funci´ on. Cuando se pasa un par´ ametro vectorial a una funci´on no se efect´ ua una copia de su contenido en la pila: s´ olo se copia la referencia a la posici´on de memoria en la que empieza el vector. ¿Por qu´e? Por eficiencia: no es infrecuente que los programas manejen vectores de tama˜ no considerable; copiarlos cada vez en la pila supondr´ıa invertir una cantidad de tiempo que, para vectores de tama˜ no medio o grande, podr´ıa ralentizar dr´asticamente la ejecuci´on del programa. La aproximaci´ on adoptada por C hace que s´olo sea necesario copiar en la pila 4 bytes, que es lo que ocupa una direcci´ on de memoria. Y no importa cu´an grande o peque˜ no sea un vector: la direcci´on de su primer valor siempre ocupa 4 bytes. Veamos gr´ aficamente, pues, qu´e ocurre en diferentes instantes de la ejecuci´on del programa. Justo antes de ejecutar la l´ınea 23 tenemos esta disposici´on de elementos en memoria:

main

v i

0

1

2

0

1

2

3

En el momento de ejecutar la l´ınea 10 por primera vez, en la funci´on incrementa, la memoria presenta este aspecto: 156

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement