UC3M

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

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

4.2. Paso de parámetros a una función

Los parámetros son variables locales a los que se les asigna un valor antes de comenzar la ejecución del cuerpo de una función. Su ámbito de validez, por tanto, es el propio cuerpo de la función. El mecanismo de paso de parámetros a las funciones es fundamental para comprender el comportamiento de los programas en C.

Considera el siguiente programa:

1
2
3
4
5
6
7
8
9
10
11
12
int addition(int a, int b) 
{
    return (a + b);
}
int main() 
{
    int x = 10;
    int y = 20;
    int z;

    z = addition(x, y);
}

Los parámetros a y b declarados en la línea 1 son válidos únicamente en la expresión de la línea 3. Las variables x, y y z, por su lado, son válidas en el cuerpo de la función main (líneas 7 a 11).

El ámbito de las variables x, y y z (ámbito llamador), y el de las variables a y b (ámbito llamado) son totalmente diferentes. El ámbito llamador desaparece temporalmente cuando se invoca la función desde la lińea 11. Durante esa ejecución, el ámbito llamado es el visible. Al terminar la función, el ámbito llamado desaparece y se recupera el ámbito llamador.

La comunicación entre estos dos ámbitos se realiza en la línea 11. Antes de comenzar la ejecución de la función, los valores de las variables del ámbito llamador son copiadas sobre las variables del ámbito llamado. Cuando termina la ejecución de la función, la expresión de la llamada en la línea 11 se reemplaza por el valor devuelto. En la siguiente figura se ilustra este procedimiento para el ejemplo anterior.

El paso de parámetros y la devolución de resultado en las funciones C se realiza por valor, es decir, copiando los valores entre los dos ámbitos .

Las variables locales de la función (incluidos los parámetros) desaparecen al término de la función, por lo que cualquier valor que se quiera guardar, debe ser devuelto como resultado (ver ejercicio 1).

4.2.1. Tablas como parámetros a una función

La copia de parámetros del ámbito llamador al llamado tiene una excepción. Cuando una función recibe como parámetro una tabla, en lugar de realizarse un duplicado se copia su dirección de memoria. Como consecuencia, si una función modifica una tabla que recibe como parámetro, estos cambios sí son visibles en el ámbito llamador. El siguiente ejemplo ilustra esta situación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define NUMBER 100
      
void fill(int table[NUMBER], int size) 
{
    int i;
    for (i = 0; i < size; i++) 
    {
        table[i] = 0;
    }
}

int main() 
{
    int i, data[NUMBER];

    for (i = 0; i < size; i++) 
    {
        data[i] = 10;
    }
    fill(data, NUMBER);
    /* Valores de data todos a cero */
}

Para la explicación de este comportamiento es preciso primero comprender el mecanismo de punteros en C.