Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Referencia

Estas en el tema de Referencia en el foro de C/C++ en Foros del Web. Hola, algo sencillo pero tengo dudas. Una variable pasada como parámetro en una función y que quiero que cambie su valor. ES ASI????? main() { ...
  #1 (permalink)  
Antiguo 10/06/2011, 02:29
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Referencia

Hola, algo sencillo pero tengo dudas.

Una variable pasada como parámetro en una función y que quiero que cambie su valor.

ES ASI?????





main()
{

int variable = 0;

funcion(&variable);

}


funcion(int *var)
{
*var = 2;
}
  #2 (permalink)  
Antiguo 10/06/2011, 03:05
 
Fecha de Ingreso: enero-2010
Mensajes: 63
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: Referencia

seria asi en c++:

Código C++:
Ver original
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6.  
  7.  
  8. int funcion(int *var)
  9. {
  10. *var = 2;
  11.  
  12. return *var ;
  13. }
  14.    
  15.  
  16.  
  17. main()
  18. {
  19.  
  20. int variable = 0;
  21.  
  22. cout<<funcion(&variable);
  23.  
  24.     system("PAUSE");
  25.     return EXIT_SUCCESS;
  26.  
  27. }
  #3 (permalink)  
Antiguo 10/06/2011, 12:06
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años
Puntos: 71
Respuesta: Referencia

Cita:
Iniciado por jobu Ver Mensaje
seria asi en c++:

Código C++:
Ver original
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6.  
  7.  
  8. int funcion(int *var)
  9. {
  10. *var = 2;
  11.  
  12. return *var ;
  13. }
  14.  
  15.  
  16.  
  17. main()
  18. {
  19.  
  20. int variable = 0;
  21.  
  22. cout<<funcion(&variable);
  23.  
  24. system("PAUSE");
  25. return EXIT_SUCCESS;
  26.  
  27. }
Sólo tendría que decir que le falta el tipo de retorno a la función main, que debe ser int.
__________________
%
El mejor guerrero no es el que triunfa siempre sino el que vuelve sin miedo a la batalla.
%
  #4 (permalink)  
Antiguo 10/06/2011, 13:28
Avatar de MaRcElTeLlA  
Fecha de Ingreso: mayo-2010
Ubicación: Martorell
Mensajes: 66
Antigüedad: 13 años, 10 meses
Puntos: 5
Respuesta: Referencia

Hola,

bueno, en C++ tienes un par de maneras de hacer que una variable obtenga el valor al modificarla.


1. Usando punteros.

Si tu lo que le metes a la función es un puntero. Al modificar el contenido de ese puntero(donde apunta), modificarás directamente la variable que quieres.

void cambiandoValor(int* i)
{
*i = 3; //Decimos, (*i) dónde apunta i, por eso el *, le asignamos el valor 3.
// i sigue siendo una dirección de memoria por eso, pero estas modificando su contenido
}

2.Pasando la variable por referencia

void cambiandoValor(int& i)
{
i=3;
}


En esta segunda función directamente haces lo que tú querias.

Qué ventaja hay en hacer esto respecto a quitarle el &??

Bien, cuando es un int no hay problema, pero si no pones el & lo que estas haciendo es una copia de todo lo que le entres a la función, y imagina que lo que le metes en lugar de ser un int es un array de imàgenes, con todos sus píxeles y todos sus canales y demás, claro para copiar eso se morirá, y la performance se verá muy afectada.


Por esa razon cuando se trabaja con datos grandes y tal está bien pasarlo por referencia (&)



Bueno, espero que te sirva chico, si hay alguna otra duda o algo no te ha quedado claro, comenta.
  #5 (permalink)  
Antiguo 10/06/2011, 14:47
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años
Puntos: 71
Respuesta: Referencia

Cita:
Iniciado por MaRcElTeLlA Ver Mensaje
Hola,

bueno, en C++ tienes un par de maneras de hacer que una variable obtenga el valor al modificarla.


1. Usando punteros.

Si tu lo que le metes a la función es un puntero. Al modificar el contenido de ese puntero(donde apunta), modificarás directamente la variable que quieres.

void cambiandoValor(int* i)
{
*i = 3; //Decimos, (*i) dónde apunta i, por eso el *, le asignamos el valor 3.
// i sigue siendo una dirección de memoria por eso, pero estas modificando su contenido
}

2.Pasando la variable por referencia

void cambiandoValor(int& i)
{
i=3;
}


En esta segunda función directamente haces lo que tú querias.

Qué ventaja hay en hacer esto respecto a quitarle el &??

Bien, cuando es un int no hay problema, pero si no pones el & lo que estas haciendo es una copia de todo lo que le entres a la función, y imagina que lo que le metes en lugar de ser un int es un array de imàgenes, con todos sus píxeles y todos sus canales y demás, claro para copiar eso se morirá, y la performance se verá muy afectada.


Por esa razon cuando se trabaja con datos grandes y tal está bien pasarlo por referencia (&)



Bueno, espero que te sirva chico, si hay alguna otra duda o algo no te ha quedado claro, comenta.
Lo que menciona el compañero MaRcElTeLlA no es del todo cierto, pués un arreglo siempre pasa por referencia y no por valor.
__________________
%
El mejor guerrero no es el que triunfa siempre sino el que vuelve sin miedo a la batalla.
%

Etiquetas: referencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:26.