Paso de Parámetros por Referencia: Uso de Punteros para Modificar Variables Fuera de Ámbito
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 4,43 KB
Paso de Parámetros por Valor: El Contexto Local
En la función llamada, cada argumento es efectivamente una variable local inicializada con el valor con que se llamó a la función.
El Desafío del Intercambio de Variables
Supongamos que necesitamos realizar con mucha frecuencia la tarea de intercambiar el valor de dos variables en nuestro programa. Ya sabemos cómo se hace, resuelto tanto a través de una variable auxiliar como gracias al operador OR exclusivo (^).
Sería muy conveniente disponer de una función a la que se le pudieran pasar, una y otra vez, el par de variables de las que deseamos intercambiar sus valores. Pero, ¿cómo lograr hacer ese intercambio a través de una función si todo lo que se realiza en la función llamada muere cuando termina su ejecución? ¿Cómo lograr que en la función que invoca ocurra realmente el intercambio de valores entre esas dos variables?
Llamadas a Funciones por Referencia
La respuesta no es trivial: cuando invocamos a la función (que llamaremos en nuestro ejemplo intercambio), las variables que deseamos intercambiar dejan de estar en su ámbito y no llegamos a ellas directamente. Toda operación en memoria que realice la función intercambio morirá con su última sentencia; su único rastro será, si acaso, la obtención de un resultado que logra sobrevivir gracias a la sentencia return.
Y aquí llegamos a la necesidad de establecer otro tipo de llamadas a funciones: las llamadas por referencia.
Mecanismo de Transferencia por Referencia
En este tipo de llamada, lo que se transfiere a la función no es el valor del argumento, sino la dirección de memoria de la variable argumento. Se copia la dirección del argumento en el parámetro formal, y no su valor.
Evidentemente, en ese caso, el parámetro formal deberá ser de tipo puntero. La variable argumento quedará fuera de ámbito, pero a través del puntero correspondiente en los parámetros formales se podrá llegar a ella y modificar su valor.
Prototipo de la Función intercambio
void intercambio(long*, long*);Definición de la Función (Método XOR)
void intercambio(long *a, long *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}Definición de la Función (Método Auxiliar)
void intercambio(long *a, long *b)
{
short aux;
aux = *b;
*b = *a;
*a = aux;
}Invocación y Ejecución
Supongamos que la función que llama a intercambio lo hace de la siguiente forma:
intercambio(&x, &y);Lo que se le pasa son las direcciones (no los valores) de las dos variables (x e y) de las que se desea intercambiar sus valores.
Comportamiento en Memoria
En la función llamante tenemos las variables x e y. En la función intercambio tenemos dos variables puntero (a y b) cuyos valores asignados serán las posiciones de memoria de x e y, respectivamente.
La función trabaja sobre los contenidos de las posiciones de memoria apuntadas por los dos punteros. Cuando termina la ejecución de la función, las dos variables puntero a y b creadas mueren. Pero ya han dejado hecha la tarea en las direcciones que recibieron al ser creadas:
- En la dirección de
xahora queda codificado el valor original dey. - En la dirección de
yahora queda codificado el valor original dex.
En cuanto termina la ejecución de intercambio, regresamos al ámbito de esas dos variables x e y, y nos las encontramos con los valores efectivamente intercambiados.
Ejemplos Comunes de Paso por Referencia
Muchos son los ejemplos de funciones que, al ser invocadas, reciben los parámetros por referencia:
- La función
scanfrecibe la dirección de la variable (usando el operador&) sobre la que el usuario deberá indicar su valor con una llamada por referencia. - La función
getsrecibe como parámetro la dirección de la cadena de caracteres donde se almacenará la cadena que introduzca el usuario.