Diferencia entre llamada por valor y llamada por referencia

Diferencia clave entre llamada por valor y llamada por referencia

  • En el método Llamada por valor, el valor original no se modifica, mientras que en el método Llamada por referencia, se modifica el valor original.
  • En Llamada por valor, se pasa una copia de la variable, mientras que en Llamada por referencia, se pasa una variable en sí.
  • En Llamada por valor, los argumentos reales y formales se crearán en diferentes ubicaciones de memoria, mientras que en Llamada por referencia, los argumentos reales y formales se crearán en la misma ubicación de memoria.
  • Llamar por valor es el método predeterminado en lenguajes de programación como C++, PHP, Visual Basic NET y C#, mientras que la llamada por referencia solo se admite en Java idioma.
  • Las variables de llamada por valor se pasan mediante un método sencillo, mientras que se requieren punteros de llamada por referencia para almacenar la dirección de las variables.

Diferencia entre llamada por valor y llamada por referencia

En los lenguajes de programación, las funciones se pueden invocar de dos formas: lo que se conoce como llamada por valor y llamada por referencia.

¿Qué es el método Llamada por valor?

El método de llamada por valor copia el valor de un argumento en el parámetro formal de esa función. Por lo tanto, los cambios realizados en el parámetro de la función principal no afectan el argumento.

En este método de paso de parámetros, los valores de los parámetros reales se copian en los parámetros formales de la función y los parámetros se almacenan en diferentes ubicaciones de memoria. Por lo tanto, cualquier cambio realizado dentro de las funciones no se refleja en los parámetros reales de la persona que llama.

¿Qué es el método de llamada por referencia?

La llamada por método de referencia copia la dirección de un argumento en el parámetro formal. En este método, la dirección se utiliza para acceder al argumento real utilizado en la llamada a la función. Significa que los cambios realizados en el parámetro alteran el argumento que se pasa.

En este método, la asignación de memoria es la misma que los parámetros reales. Todas las operaciones de la función se realizan sobre el valor almacenado en la dirección del parámetro real, y el valor modificado se almacenará en la misma dirección.

Ejemplo de código C de un método de llamada por valor

void main() {
        int a = 10,
        void increment(int);
        Cout << "before function calling" << a;
        increment(a);
        Cout << "after function calling" << a;
        getch();

        void increment(int x) {
            int x = x + 1;
            Cout << "value is" << x;
        }

Salida:

before function calling 10
value is 11
after function calling 1-0

Porque la variable declarada 'a' en main() es diferente de la variable 'x' en incremento(). En este programa sólo los nombres de las variables son similares, pero sus direcciones de memoria son diferentes y se almacenan en diferentes ubicaciones de memoria.

Java Ejemplo de código de un método de llamada por referencia

Public static void main(string args[]) {
    int a = 10;
    System.out.println("Before call Value of a = ", a);
    Void increment();
    System.out.println("After call Value of a = ", a);
}

Void increment(int x) {
    int x = x + 1;
}

Salida:

Before call Value of a =10
After call Value of a =11

Porque la variable declarada 'a' hace referencia/apunta a la variable 'a' en main(). Aquí el nombre de la variable es diferente, pero ambos apuntan/hacen referencia a las mismas ubicaciones de direcciones de memoria.

Llamada por valor frente a llamada por referencia

parámetros Llamada por valor Llamar por referencia
Definición Al llamar a una función, cuando pasa valores copiando variables, se conoce como "Llamada por valores". Al llamar a una función, en el lenguaje de programación en lugar de copiar los valores de las variables, se utiliza la dirección de las variables, lo que se conoce como “Llamada por referencias”.
Argumentos En este método, se pasa una copia de la variable. En este método, se pasa una variable en sí.
Efecto Los cambios realizados en una copia de la variable nunca modifican el valor de la variable fuera de la función. El cambio en la variable también afecta el valor de la variable fuera de la función.
Alteración de valor No le permite realizar ningún cambio en las variables reales. Le permite realizar cambios en los valores de las variables mediante llamadas a funciones.
Paso de variable Los valores de las variables se pasan mediante un método sencillo. Se requieren variables de puntero para almacenar la dirección de las variables.
Modificación de valor Valor original no modificado. Se modifica el valor original.
Ubicación de la memoria Argumentos reales y formales.
se creará en diferentes
ubicación de memoria
Argumentos reales y formales.
será creado en el mismo
ubicación de memoria
Seguridad Los argumentos reales permanecen
seguros ya que no se pueden modificar
accidentalmente.
Los argumentos reales no son
Seguro. Ellos pueden ser
modificado accidentalmente, por lo que debe manejar las operaciones de argumentos con cuidado.
Predeterminado Por defecto en muchas programaciones
idiomas como C++.PHP. Visual Basic NET y C#.
Es apoyado por la mayoría
lenguajes de programación como JAVA, pero
no por defecto.

Ventajas de utilizar el método Llamada por valor en C

Pros/beneficios de una llamada por valor en C:

  • El método no cambia la variable original, por lo que preserva los datos.
  • Siempre que se llame a una función, nunca afecte el contenido real de los argumentos reales.
  • El valor de los argumentos reales se pasa a los argumentos formales, por lo que cualquier cambio realizado en el argumento formal no afecta los casos reales.

Ventajas de utilizar el método Llamada por referencia

Ventajas de utilizar el método de llamada por referencia:

  • La función puede cambiar el valor del argumento, lo cual es bastante útil.
  • No crea datos duplicados para contener un solo valor, lo que le ayuda a ahorrar espacio en la memoria.
  • En este método, no hay copia del argumento realizado. Por eso se procesa muy rápido.
  • Le ayuda a evitar cambios realizados por error.
  • Una persona que lee el código nunca sabe que el valor se puede modificar en la función.

Desventajas de utilizar el método Llamada por valor

A continuación se detallan las principales desventajas/desventajas de un método de llamada por valor:

  • Los cambios en los parámetros reales también pueden modificar las variables de argumento correspondientes.
  • En este método, los argumentos deben ser variables.
  • No se puede cambiar directamente una variable en el cuerpo de una función.
  • A veces los argumentos pueden ser expresiones complejas.
  • Hay dos copias creadas para la misma variable que no ahorra memoria.

Desventajas de utilizar el método Llamada por referencia

Estas son las principales desventajas de usar el método de llamada por referencia:

  • Fuerte garantía no nula. Una función que toma una referencia debe asegurarse de que la entrada no sea nula. Por lo tanto, no es necesario realizar una verificación nula.
  • Pasar por referencia hace que la función no sea pura teóricamente.
  • Una garantía de por vida es un gran problema con las referencias. Esto es especialmente peligroso cuando se trabaja con lambdas y programas multiproceso.