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 x ahora queda codificado el valor original de y.
  • En la dirección de y ahora queda codificado el valor original de x.

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 scanf recibe 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 gets recibe como parámetro la dirección de la cadena de caracteres donde se almacenará la cadena que introduzca el usuario.

Entradas relacionadas: