Técnicas de paso de parámetros en C/C++

Hay diferentes formas en las que los datos de los parámetros se pueden pasar dentro y fuera de los métodos y funciones. Supongamos que se llama a una función B() desde otra función A() . En este caso, A se denomina «función de llamador» y B se denomina «función de llamado o función de llamado» . Además, los argumentos que A envía a B se denominan argumentos reales y los parámetros de B se denominan argumentos formales .

Terminología

  • Parámetro Formal: Una variable y su tipo tal como aparecen en el prototipo de la función o método.
  • Parámetro real: la variable o expresión correspondiente a un parámetro formal que aparece en la llamada de función o método en el entorno de llamada.
  • Modos:
    • IN: pasa información de la persona que llama a la persona que llama.
    • SALIDA: El destinatario escribe valores en el llamante.
    • ENTRADA/SALIDA: La persona que llama le dice al destinatario el valor de la variable, que puede ser actualizado por el destinatario.

Métodos importantes de paso de parámetros

  1. Pasar por valor: este método utiliza semántica en modo . Los cambios realizados en el parámetro formal no se transmiten de vuelta a la persona que llama. Cualquier modificación a la variable de parámetro formal dentro de la función o método llamado afecta solo a la ubicación de almacenamiento separada y no se reflejará en el parámetro real en el entorno de llamada. Este método también se llama llamada por valor .

    C

    // C program to illustrate
    // call by value
    #include <stdio.h>
      
    void func(int a, int b)
    {
        a += b;
        printf("In func, a = %d b = %d\n", a, b);
    }
    int main(void)
    {
        int x = 5, y = 7;
      
        // Passing parameters
        func(x, y);
        printf("In main, x = %d y = %d\n", x, y);
        return 0;
    }

    CPP

    // C++ program to illustrate
    // call by value
    #include <iostream>
    using namespace std;
      
    void func(int a, int b)
    {
        a += b;
        cout <<"In func, a = " << a << " b = "<< b << endl;
    }
    int main(void)
    {
        int x = 5, y = 7;
      
        // Passing parameters
        func(x, y);
        cout << "In main, x = " << x << " y = " << y;
        return 0;
    }
      
    // This code is contributed by shivanisinghss2110

    Producción:

    In func, a = 12 b = 7
    In main, x = 5 y = 7
    

    Los lenguajes como C, C++, Java admiten este tipo de paso de parámetros. Java, de hecho, es estrictamente llamada por valor.
    Deficiencias:

    • Ineficiencia en la asignación de almacenamiento
    • Para objetos y arrays, la semántica de copia es costosa
  2. Pass by reference(aliasing): This technique uses in/out-mode semantics. Changes made to formal parameter do get transmitted back to the caller through parameter passing. Any changes to the formal parameter are reflected in the actual parameter in the calling environment as formal parameter receives a reference (or pointer) to the actual data. This method is also called as call by reference. This method is efficient in both time and space.

    C

    // C program to illustrate
    // call by reference
    #include <stdio.h>
      
    void swapnum(int* i, int* j)
    {
        int temp = *i;
        *i = *j;
        *j = temp;
    }
      
    int main(void)
    {
        int a = 10, b = 20;
      
        // passing parameters
        swapnum(&a, &b);
      
        printf("a is %d and b is %d\n", a, b);
        return 0;
    }

    CPP

    // C++ program to illustrate
    // call by reference
    #include <iostream.h>
    using namespace std;
      
    void swapnum(int* i, int* j)
    {
        int temp = *i;
        *i = *j;
        *j = temp;
    }
      
    int main(void)
    {
        int a = 10, b = 20;
      
        // passing parameters
        swapnum(&a, &b);
      
        cout <<"a is " << a <<" and b is "<< b;
        return 0;
    }
      
    // this code is contributed by shivanisinghss2110

    Output:

    a is 20 and b is 10
    

    C and C++ both support call by value as well as call by reference whereas Java doesn’t support call by reference.
    Shortcomings:

    • Many potential scenarios can occur
    • Programs are difficult to understand sometimes

Otros métodos de paso de parámetros

Estas técnicas son más antiguas y se utilizaron en lenguajes de programación anteriores como Pascal, Algol y Fortran. Estas técnicas no son aplicables en lenguajes de alto nivel.

  1. Pasar por resultado: este método utiliza una semántica fuera de moda . Justo antes de que el control se transfiera nuevamente a la persona que llama, el valor del parámetro formal se transmite nuevamente al parámetro real. Este método a veces se denomina llamada por resultado . En general, la técnica de pase por resultado se implementa por copia.
  2. Pasar por valor-resultado: este método utiliza semántica de modo de entrada/salida . Es una combinación de Pass-by-Value y Pass-by-result. Justo antes de que el control se transfiera nuevamente a la persona que llama, el valor del parámetro formal se transmite nuevamente al parámetro real. Este método a veces se denomina llamada por valor-resultado
  3. Pasar por nombre: Esta técnica se utiliza en lenguajes de programación como Algol . En esta técnica, se pasa el » nombre » simbólico de una variable, lo que permite tanto su acceso como su actualización.
    Ejemplo:
    para duplicar el valor de C[j] , puede pasar su nombre (no su valor) al siguiente procedimiento.
    procedure double(x);
      real x;
    begin 
      x:=x*2
    end;
    

    En general, el efecto de pasar por nombre es sustituir textualmente el argumento en una llamada de procedimiento por el parámetro correspondiente en el cuerpo del procedimiento.
    Implicaciones del mecanismo Pass-by-Name:

    • La expresión del argumento se vuelve a evaluar cada vez que se pasa el parámetro formal.
    • El procedimiento puede cambiar los valores de las variables utilizadas en la expresión del argumento y, por lo tanto, cambiar el valor de la expresión.

Este artículo es una contribución de Krishna Bhatia . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *