Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Dark Invader en 26 Julio 2011, 15:46 pm



Título: Dudas con las referencias
Publicado por: Dark Invader en 26 Julio 2011, 15:46 pm
Hola a todos,resulta que tengo este codigo:
Código
  1. int& maxref(int& a, int& b)
  2. {
  3. if (a >= b)
  4. return a;
  5. else
  6. return b;
  7. }
  8.  
  9. maxref(i, j) = 0;

He estado practicando con referencias sencillas,como por ejemplo:
Código
  1. int i=2;
  2. int& iref = i;

Lo malo es que en las funciones de este tipo me lio un poco,veamos se pasa la los parametros i,j y la funcion recoje la memoria donde están almacenados ambos,luego imaginemos que a es mayor que b,retorna a,pero ¿que retorna exactamente?¿su direccion de memoria?.Lo que si se es que el valor retornado se le asigna el valor de 0 pero lo que no entiendo bien es:

Código
  1. int& maxref


He probado también a ponerlo sin el apersand,y me da el mismo valor¿es que estoy haciendo dos cosas iguales?Porque lo que me despista es eso,lo demas para nada.

Puede parecer un poco simple,pero he trabajado con muchas funciones de pasar los parametros por valor y por referencia tipo:

Código
  1. int a =3;
  2. int j = 5;
  3. int funcion(&a,&j);
  4.  
  5. int funcion(int *a ,int *b){
  6. etc}

Pero nunca tuve que usar este tipo,he buscado algo de información pero no me lo ha dejado suficientemente claro...Si alguien me pudiera echar un cable se lo agradeceria.

Un saludo


Título: Re: Dudas con las referencias
Publicado por: El_Java en 26 Julio 2011, 23:52 pm
No soy un experto en esto, pero creo que lo que hace la funcion es que devuelve int&, osea, la dirección de la función que resulta que es mas grande de las dos, al trabajar por referencia no se hacen copias, se trabaja directamente con la variable, y lo que capta & es la dirección.

Pd. podrias mejorar el codigo bastante, no sé si estan el operador ternario en C, pero podrias hacer:
Código
  1. return (a >= b ? a : b);
Si no existe el ?: como en C++, puedes quitar el else, porque es innecesario
Código
  1. if(a >= b) return a;
  2. return b;

Un saludo :)


Título: Re: Dudas con las referencias
Publicado por: leogtz en 26 Julio 2011, 23:56 pm
Sí que está el operador ternario en C  :)


Título: Re: Dudas con las referencias
Publicado por: Dark Invader en 27 Julio 2011, 09:18 am
Gracias El java,el codigo no es mio por eso no utilice el operador ternario,es un codigo de prueba que estaba en un tutorial...Ahora bien,esto es pasar por referencia,pero como ya dije yo usaba otra nomenclatura¿es distinta o es lo mismo?¿porque si al quitar el operador & de la funcion sigue dando el mismo resultado? :-\

Un saludo


Título: Re: Dudas con las referencias
Publicado por: 4rkn63l en 27 Julio 2011, 09:34 am
Te sigue dando el mismo resultado por que los parametros (a y b) siguien siendo referencias a las variables originales, recuerda que las referencias se utilizan como aliases, por lo tanto cuando pones un
Código
  1. return a;
o
Código
  1. return b;
estas devolviendo un entero, pero ademas ese entero puede ser modificado por que se refiere a la variable original que fue pasada por referencia. Por eso poner o no el ampersand no afecta el resultado.


Título: Re: Dudas con las referencias
Publicado por: Dark Invader en 27 Julio 2011, 13:37 pm
Entiendo,muchas gracias 4rkn63l y a El java,me habeis solucionado la duda.  :P

Un saludo