Pasando argumentos a las funciones

Cuando se llama a una función, el primer argumento en la llamada es pasado al primer parámetro de la función, el segundo argumento al segundo parámetro y así sucesivamente. Por defecto, los argumentos, a excepción de las matrices, son pasados por valor. Esto significa que a la función se pasa una copia del valor del argumento. La función al trabajar con la copia no podrá alterar las variables de donde proceden los valores pasados.

En el siguiente ejemplo, observamos que la función main llama a la función intercambio y le pasa los argumentos ab. La función intercambio almacena en x el valor de a y en y el valor  de b. Esto significa que los datos a y b se han duplicado.

intercambio_1

Cuando se inicia la ejecución de la función main se definen las variables a y b con los valores 20 y 30, respectivamente.

variables_1

Cuando main llama a la función intercambio, se definen dos nuevas variables, x e y, las cuales se inician con los valores de a y b, respectivamente.

variable_2

Continúa la ejecución de la función intercambio. Se define una nueva variable z que se inicia con el valor de x.

variable_34

A continuación, en x se copia el valor de y, y en y el valor de z (el que tenia x al principio).

corregido

 funcion_6Por lo tanto, una vez que se ha ejecutado la función y se devuelve el flujo a la función main, significa que la función intercambio finalizó, por lo que el estado de la memoria vuelve a los valores del principio.

funcion_7

Si lo que deseamos es alterar los contenidos de los argumentos especificados en la llamada, entonces hay que pasar dichos argumentos por referencia, es decir, a la función le pasaremos la dirección de cada argumento en vez de su valor, lo que exige que los parámetros formales correspondientes sean punteros.

Para pasar la dirección de un argumento, ponemos delante de la variable el operador &.

Si queremos que el intercambio suceda sobre las variables a y b de main, la función intercambio tiene que conocer la posición de memoria física que ocupan las variables a y b, de esta forma podrá dirigirse a ellas y alterar su valor.

Veamos una modificación del programa anterior que pasa los argumentos por referencia:

referencia2_listado

Desglosando:

referencia_9

Cuando ejecutemos el programa, la función main definirá las variables a y b y llamará a la función intercambio pasando las direcciones de dichas variables como argumento.

referencia2_salida

El valor del primer argumento será pasado al primer parámetro …

parametro_1

… y el valor del segundo argumento, al segundo parámetro.

parametro_2

Suponiendo que las direcciones sean 0xbfc4a5d4 y 0xbfc4a5d8, respectivamente, tenemos que:

grafico_memoria_1

referencia_3

Ahora x apunta al dato a; esto es, el valor de x especifica la dirección de memoria o lugar donde se localiza a. Análogamente diremos que y apunta a b.

Vemos que *x apunta al contenido que hay en la posición de memoria 0xbfc4a5d4 que hace referencia al mismo dato que a

referencia_5… y que *y hace referencia al mismo dato que b.

referencia_6

 Dicho de otra forma *x y a representan el mismo dato, 20, al igual que *y y b  también representan el mismo dato, 30.

Según lo expuesto, cuando se ejecuten las sentencias de la función intercambio, el estado de la memoria se modificará como se indica en el gráfico mostrado a continuación:

referencia_9

Desglosamos minuciosamente para ir aclarando el tema de las referencias:

referencia_10

Cuando la función intercambio finaliza, los valores de a y b han sido intercambiados y las variables z, x e y, respectivamente, por el hecho de ser locales, son destruidas.

Otra forma de resolver el problema anterior es utilizando referencias en lugar de punteros. Recordemos que una referencia es un nombre alternativo para una variable.

Modifiquemos el ejemplo anterior:

referencia3_listado

Podemos ver la función intercambio con dos parámetros x e y y que son referencia, esto es, x e y son sinónimos de a y b, respectivamente. Esta forma de proceder es más sencilla, sin embargo presenta un inconveniente, que no se sabe si los argumentos son pasados por valor o por referencia.

Resumiendo, pasar parámetros por referencia a una función es hacer que la función acceda indirectamente a las variables pasadas, y a diferencia de cuando se pasan los parámetros por valor, no hay datos duplicados.

atras2

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s