2010-02-17 14 views
7

Duplicar posibles:
Difference between value parameter and reference parameter ?diferencia entre la llamada por referencia y llamada por valor

¿Cuál es la diferencia entre la llamada por referencia y llamada por valor?

+1

pregunta de tarea :) – Shoban

+7

Mucha gente parece tener suficientes representantes para cerrar preguntas y aún no entienden "No es real pregunta "razón para cerrar". Esta es claramente una pregunta real con una respuesta precisa, independientemente de por qué se está preguntando. –

Respuesta

0

Los argumentos que se pasan a la función pueden ser de dos tipos a saber 1. valores pasados ​​ 2. Dirección pasado

El primer tipo se refiere a llamar por valor y el segundo tipo se refiere a la llamada por referencia. Por ejemplo consideran programa1

main() 
    { 
     int x=50, y=70; 
     interchange(x,y); 
     printf(“x=%d y=%d”,x,y); 
    } 

    interchange(x1,y1) 
    int x1,y1; 
    { 
     int z1; 
     z1=x1; 
     x1=y1; 
     y1=z1; 
     printf(“x1=%d y1=%d”,x1,y1); 
    } 

Aquí el valor de funcionar intercambio se pasa por valor.

Considere program2

main() 
{ 
    int x=50, y=70; 
    interchange(&x,&y); 
    printf(“x=%d y=%d”,x,y); 
} 

interchange(x1,y1) 
int *x1,*y1; 
{ 
    int z1; 
    z1=*x1; 
    *x1=*y1; 
    *y1=z1; 
    printf(“*x=%d *y=%d”,x1,y1); 
} 

Aquí la función es llamada por referencia. En otras palabras, la dirección se pasa utilizando el símbolo & y se accede al valor mediante el símbolo *.

La diferencia principal entre ellos se puede ver analizando la salida de program1 y program2.

La salida de programa1 que es llamada por valor es

x1=70 y1=50 
x=50 y=70 

Pero la salida de program2 que es llamada por referencia es

*x=70 *y=50 
x=70 y=50 

Esto se debe a que en el caso de la llamada por el valor del valor se pasa a la función llamada como intercambio y allí el valor se intercambió y se imprimió como

x1=70 y1=50 

y otra vez, ya que no valores se devuelven de nuevo y por lo tanto los valores originales de X e Y como en la función principal a saber

x=50 y=70 got printed. 
+1

Guau, el parámetro de estilo K & R pasa :) – Messa

+3

No sabía que la gente todavía programara en K & R C. :-) –

+0

@ Messa, @ Alok, solo intentaba explicar el concepto, personalmente nunca he codificado en C después de la universidad y para sorpresa, no sabía que este es el estilo de K & R, gracias por dejarme saber :) –

0
Call by value: 

1 
2 
3 
4 
5 
6 
7 
    void foo(int x) { 
     cout << x << endl; 
     x = 4; 
    } 

    int someVar = 5; 
    foo(someVar); 


The value 5 is pushed onto the stack and foo is called. Inside foo(), 5 is popped off the stack and output. x = 4 modifies the stack copy, which is then thrown away when the function returns. 

1 
2 
3 
4 
5 
6 
7 
    void foo(int& x) { 
     cout << x << endl; 
     x = 4; 
    } 

    int someVar = 5; 
    foo(someVar); 


The address of someVar is pushed onto the stack and foo is called. Inside foo, the address is popped off the stack and the integer stored at that address is output. x = 4 modifies the memory referred to by the address, which means that when foo() returns, someVar now has the value 4. 

Contrast the above code to 

1 
2 
3 
4 
5 
6 
7 
    void foo(int* x) { 
     cout << *x << endl; 
     *x = 4; 
    } 

    int someVar = 5; 
    foo(&someVar); 


This code does the exact same thing as my reference example, it's just the syntax is a bit different: note the &someVar where foo is called, and note the *x in foo() to refer to the integer value. 
11

En C, no hay ninguna llamada por referencia. Lo más cercano que puede obtener es tomar una dirección y pasar una copia de esa dirección (por valor - ver más abajo).

En C++, la llamada por referencia pasa una referencia a un objeto (un alias para el objeto original). En general, esto se implementará como la dirección del objeto, aunque eso no está garantizado.

Llamar por valor significa tomar un valor de algún tipo y pasar una copia de ese valor a la función.

La diferencia básica es que cuando pasa un parámetro por valor, la función recibe solamente una copia del objeto original, por lo que no puede hacer nada para afectar el objeto original. Con pass by reference, obtiene una referencia al objeto original, por lo que tiene acceso al objeto original, no una copia del mismo, a menos que sea una referencia constante, puede modificar el objeto original (por ejemplo).

3

Brevemente, llamadas por referencia es cuando una función se puede modificar sus argumentos:

def f(x): 
    x := x + 1 
    print(x) 

x := 1 
f(x) 
/* Now, x is 2 */ 
print(x) 

En "llamada por referencia", lo anterior se imprimirá 2 dos veces.

Llamar por valor es cuando una función recibe una copia del argumento que se le pasa, por lo que la persona que llama no ve ninguna modificación. Con f(x) definen como anteriormente, llamada por valor sería:

x := 1 
f(x) 
/* x is 1 in the caller */ 
print(x) 

En lo anterior, el interior f(x), la llamada impresión imprimiría 2, pero que sólo se modifica la copia de x que f() consiguió, por lo que en la persona que llama, x sigue siendo uno, y el segundo print() imprime 1.

0

En llamada por referencia, obtendrá la instancia de una variable. Después de cambiar los parámetros de la función, en este caso su variable cambiará en el método de llamada. En llamada por valor, obtendrá la copia de la instancia. Y en este caso los cambios de la variable de parámetro no influirán en la variable que estaba en el método de llamada

Cuestiones relacionadas