UC3M

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

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

5.7. Uso de la indirección

El uso de punteros en C sólo se justifica si ofrecen una clara ventaja frente a la manipulación de datos directamente. A continuación se describen dos situaciones en las que el uso de punteros redunda en código más eficiente, es decir, que ejecuta a una mayor velocidad, o que ocupa un menor espacio en memoria.

5.7.1. Parámetros por referencia

Hay situaciones en que nos interesará crear funciones que modifiquen el valor de la variable que se le pasa como parámetro y que esta modificación retorne a la función llamadora. En ese caso, decimos que los parámetros se pasan por referencia. Cuando se pasa una variable por referencia, el compilador no pasa la copia de un valor del argumento (como hemos visto en la sección de funciones); sinó que pasa una referencia que indica a la función dónde se encuentra la variable en memoria. Por tanto, al pasar la dirección de memoria, cuando se hacen cambios sobre esa variable en la función se estará variando el valor de la variable y no el de su copia. Un ejemplo muy claro de función que pasa valores por referencia es el de la función "swap" o "intercambiador". La función "swap" recibe dos parámetros e intercambia el valor del uno por el otro. Observa el código que implementa esta función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 #include <stdio.h>
     
      /* Definición de función "swap". Fíjate que las variables se reciben como puntero a esas variables. */
     void sswap ( int *x, int *y )
      {
          /*Declaramos una variable temporal*/
          int tmp;
          tmp = *x;
          *x = *y;
          *y = tmp;
      }
      
      int main() 
      {
            int a, b;
            a = 1;
            b = 2;

            /*Llamamos a la función "swap" pasándole la dirección a las variables a y b.*/
            swap( &a, &b );
            /*Imprime los valores de a y b intercambiados*/
            printf(" a = %d b = %d\n", a, b );

      }
     

Si copias el código y lo ejecutas verás que el programa imprime los valores de a y b intercambiados. Esto ocurre porque la función, en vez de recibir los parámetros por valor, los recibe por referencia, es decir, recibe su dirección de memoria. Cuando, dentro de la función, se alteran los valores de a y b, se accede directamente al contenido de la dirección de memoria. Por esa razón, fuera del ámbito de la función, a y b mantienen los cambios que han sufrido en la función.

Sugerencia

Modifica el programa anterior sin usar indirecciones. Verás que, cuando salgas de la función los valores de a y b serán los mismo que al inicio, sin haberse intercambiado.