• Sábado 14 de Diciembre de 2024, 19:49

Autor Tema:  Función con & delante  (Leído 1439 veces)

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Función con & delante
« en: Sábado 18 de Septiembre de 2010, 12:07 »
0
Hola, es la primera vez que veo esto y me ha surgido la duda.

Por ejemplo, una función así:

int *ObtenerDireccionEntero(int num)

devolvería la dirección de memoria del entero que se pasa como parámetro, pero la función:


int &ObtenerDireccionEntero(int num)

qué devolvería?

Gracias.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Función con & delante
« Respuesta #1 en: Sábado 18 de Septiembre de 2010, 20:35 »
0
A ver, vamos por partes.

El que tu digas que una funcion llamada ObtenerDireccionEntero devuelve la direccion de un entero, no tiene mucho sentido, pues el operador & ya devuelve una direccion, y se puede utiliza para devolver la direccion de cualquier tipo de variable, no solo las de tipo entero, entonces no tiene caso "inventar" una funcion para devolver la direccion de variables, si ya existe un operador en C/C++ que hace precisamente eso.

En segundo lugar, int *ObtenerDireccionEntero(int num), NO devuelve una direccion, en realidad lo que devuelve es un apuntador a un entero, que de manera implicita los apuntadores manejan direcciones de memoria, y que estas direcciones se manejen por medio de enteros, no significa que podamos usar variables de tipo entero como sustituto de variables apuntador. De hecho, segun el tipo de apuntador (char, int, float, etc), el compilador genera el codigo adecuado para manejarlo, ya que cada tipo de variable utiliza internamente diferente cantidad de memoria (char un byte, int 2 bytes, float 6 bytes), entonces cuando declaramos un arreglo dinamico de apuntadores por medio de memoria dinamica (lease malloc, o new) se genera codigo para que se desplace por el arreglo de manera correcta, de esa forma si tenemos un arreglo dinamico de floats, casa vez que el apuntador se mueve hacia adelante, se mueve 6 bytes, y no un byte como si fuera char, no se si me explique lo suficiente.

Por ultimo, si querias saber que pasaria si substituyes * por &, en realidad lo que pasaria es que te devolveria el valor contenido en la direccion de memoria y no la direccion de memoria en si, aunque eso lo podrias saber directamente usando la variable, en lugar de la funcion.

A continuacion te muestro un programa que te muestra los diferentes supuestos. En mi caso me mostro una advertencia porque estoy tratando de obtener la direccion de una variable local que fue destruida, lo que podria causar porblemas si trato de usar esa direccion, ya que como dije antes fue destruida, y entonces usarla podria corromper la memoria de otra variable.

El 1er numero que imprime es la direccion de la variable local num.
El 2o numero veras que es el valor contenido en la variable local num, en este caso 10, que es el que le pasamos como parametro por medio de la variable numero
El 3er Numero es la direccion de numero, obtenido por medio de la funcion.
El 4o  Numero es la direccion de numero, obtenido por medio del operador &, como veras da el mismo numero, con lo que como dje antes, es innecesario crear una funion qe devuelva la direccion, si ya existe.

Saludos :)

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstdlib>
  4.  
  5. int r;
  6.  
  7. int *ObtenerDireccionEntero1(int num)
  8. {
  9.    
  10.     return &num;
  11. }
  12.  
  13. int &ObtenerDireccionEntero2(int num)
  14. {
  15.    
  16.     return num;
  17. }
  18.  
  19. int *ObtenerDireccionEntero3(int* num)
  20. {
  21.    
  22.     return &*num;
  23. }
  24.  
  25.  
  26. int main()
  27. {
  28.     int numero = 10;
  29.  
  30.     printf("%dn", ObtenerDireccionEntero1(numero));
  31.     printf("%dn", ObtenerDireccionEntero2(numero));
  32.     printf("%dn", ObtenerDireccionEntero3(&numero));
  33.     printf("%dn", &numero);
  34.  
  35.     return 0;
  36. }
  37.  
  38.  

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Función con & delante
« Respuesta #2 en: Sábado 18 de Septiembre de 2010, 23:25 »
0
Muchas gracias por la explicación, ha quedado todo muy claro.

Añado  otra pregunta que me ha venido a la mente, teniendo en cuenta que lo hago para C++:

En el caso 2 devuelve el valor de la variable local num que se pasa como parámetro por valor.

Si la función fuera así:

Código: C++
  1.  
  2. int &ObtenerDireccionEntero2(int &num)
  3. {
  4.   
  5.  return num;
  6. }
  7.  
  8. int main()
  9. {
  10.     int numero = 10;
  11.  
  12.    cout << ObtenerDireccionEntero2(numero) << endl;
  13.  
  14. return 0;
  15. }
  16.  
  17.  

Devolvería el valor de la variable numero que se pasa por referencia, ya que la variable "num" ya no actúa como local en la función porque se está pasando por referencia, cierto?

Gracias.