15. Parámetros de entrada/salida en C

Última modificación por editor1 el 2018/09/17 10:34

Objetivo

  • Entender la relación entre puntero y parámetros de salida o entrada/salida en C.

Introducción

Anteriormente hemos visto que, cuando queremos pasar un parámetro a una función/acción que sea de salida o entrada/salida, había que utilizar un puntero y, por lo tanto, había que utilizar este parámetro de una forma un poco diferente a un parámetro de entrada. Vamos a ver un ejemplo muy sencillo y su representación en memoria para entender cómo funcionan este tipo de parámetros.

1. Ejemplo de parámetros de salida y entrada/salida en C

Tenemos la acción principal, la cual tiene una variable a de tipo entero, la inicializa a 3 y la pasa a una segunda acción f, la que simplemente suma 2 al valor del parámetro p.

[Ejemplo 15_01]

action f(in p: integer)
    p:=p+2;
end action

algorithm example1

    var 
        a: integer;
    end var

    a:=3;
    f(a);

    writeInteger(a);
end algorithm

#include <stdio.h>

void f(int p) {
    p=p+2;
}

int main() {

   /* Variable definition */
   int a=3;

    f(a);
    printf("%d \n", a);

   return 0;
}

A continuación, se muestra la representación en memoria del programa y cómo va evolucionando. De izquierda a derecha tenemos:

  1. Ha comenzado la ejecución, por lo tanto, la función principal está en memoria, y contiene una variable a de tipo entero con un valor de 3.
  2. La acción principal ha llamado la acción f, por lo que esta ahora se encuentra en memoria. Vemos que tiene una variable p de tipo entero. Como se ha llamado a f pasando el parámetro a de la acción principal, la variable p contiene el valor de a.
  3. La acción f modifica la variable p, sumando 2 a su valor.
  4. Al haber terminado la ejecución de la acción f, esta ya no está en memoria y vemos que el valor de la variable a de la acción principal no se ha visto alterado.

FuncParameterValue.png

Ahora vamos a cambiar el código anterior para que el parámetro se pase como parámetro de entrada/salida. Por tanto, en su codificación en C veremos que se sustituye p por un puntero a entero.

[Ejemplo 15_02]

action f(inout p: integer)
     p:=p+2;
end action

algorithm example2

    var 
        a: integer
    end var

    a:=3;
    f(a);
    writeInteger(a);
end algorithm

#include <stdio.h>

void f(int *p) {
   *p=*p+2;
}

void main() {

   /* Variable definition */
   int a=3;

    f(&a);
    printf("%d \n", a);

   return 0;
}

A continuación, se muestra la representación en memoria del programa y cómo va evolucionando. De izquierda a derecha tenemos:

  1. Ha comenzado la ejecución, por lo tanto, la función principal está en memoria, y contiene una variable a de tipo entero con un valor de 3.
  2. La acción principal ha llamado a la acción f, por lo que esta ahora se encuentra en memoria. Vemos que tiene una variable p de tipo puntero a entero. Como se ha llamado a f pasando la dirección de la variable a de la acción principal, la variable p contiene la dirección de a.
  3. La acción f modifica el contenido de la variable p, sumando 2 a su valor. Al ser un puntero, realmente se está modificando el valor que está guardado en la variable a de la acción principal.
  4. Al haber terminado la ejecución de la acción f, esta ya no está en memoria y vemos que el valor de la variable a de la acción principal se ha visto alterado, y ahora contiene el valor 5.

FuncParameterReference.png

Vemos que en este segundo caso, el hecho de utilizar punteros ha permitido que los cambios efectuados dentro de la acción se propaguen al programa principal. En el primer caso, decimos que se ha pasado la variable a a la acción f por valor, mientras que en el segundo caso diremos que se ha pasado la variable a a la acción f por referencia.

Resumen

En esta guía hemos visto un ejemplo de aplicación del paso de parámetros de entrada/salida en lenguaje C.

Etiquetas:
Creado por editor1 el 2018/09/17 10:33