• Viernes 29 de Marzo de 2024, 10:35

Autor Tema:  Duda con puntero a función en lenguaje C.  (Leído 3992 veces)

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Duda con puntero a función en lenguaje C.
« en: Jueves 26 de Septiembre de 2013, 00:30 »
0
Hola a todos.
Me podrían decir la diferencia de una manera u otra  de utilizar paso por referencia a función.-

Código: C
  1. #include <stdio.h>
  2.  
  3. int suma(int a, int b, int *res)
  4. {
  5.     *res = a + b;
  6. }
  7.          
  8. int main(void)
  9. {
  10.     int a = 5, b = 9, res;
  11.  
  12.     res = suma(a,b,&res);
  13.     printf("\n  El resultado es...: %d\n", res);
  14.  
  15.     printf("\n Pulse una tecla para cerrar la aplicacion..."); getchar();
  16.     return 0;
  17. }

Código: C
  1. #include <stdio.h>
  2.  
  3. int suma(int *a, int *b, int *res)
  4. {
  5.     *res = *a + *b;
  6. }
  7.          
  8. int main(void)
  9. {
  10.     int a = 5, b = 9, res, *pa = &a, *pb = &b;
  11.  
  12.     res = suma(&a,&b,&res);
  13.     printf("\n  El resultado es...: %d\n", res);
  14.  
  15.    printf("\n Pulse una tecla para cerrar la aplicacion..."); getchar();
  16.    return 0;
  17. }

Bueno espero aclaración.-
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Duda con puntero a función en lenguaje C.
« Respuesta #1 en: Jueves 26 de Septiembre de 2013, 22:27 »
0
Hola DanielC#, bueno para empezar no se si compilaste tu ejemplo, pero esta equivocado, me parece que tu funcion deberia ser void suma() en lugar de int suma(), ya que no tienes nungun return dentro de suma.

Ahora, suponiendo que es void suma(), en el ejemplo que pusiste en realidad no hay ninguna diferencia en el resultado obtenido, porque no estas modificando el valor de a y b dentro de la funcion suma, los parametros por referencia se utilizan cuando necesitamos hacer una modificacion en el valor de un parametro dentro de una funcion y necesitamos que esa modificacion se conserve fuera de la funcion.

En el siguiente ejemplo modificamos los valores de a y b, y ahi si como veras hay diferencia entre usar parametros por valor y por referencia, ya que en el primer caso a y b conservaran sus valores de 5 y 9 y en el segundo caso sus valores seran modificados a 10.

Código: [Seleccionar]
void suma(int a, int b, int *res)
{
    a = 10; b = 10;
    *res = a + b;
}

int main(void)
{
    int a = 5, b = 9, res;

    printf("Valor a = %d; Valor b = %d\n", a, b);
    suma(a,b,&res);
    printf("Valor a = %d; Valor b = %d\n", a, b);
    printf("\n  El resultado es...: %d\n", res);

    printf("\n Pulse una tecla para cerrar la aplicacion..."); getchar();
    return 0;
}

Código: [Seleccionar]
void suma(int *a, int *b, int *res)
{
    *a = 10; *b = 10;
    *res = *a + *b;
}

int main(void)
{
    int a = 5, b = 9, res;

    printf("Valor a = %d; Valor b = %d\n", a, b);
    suma(&a,&b,&res);
    printf("Valor a = %d; Valor b = %d\n", a, b);
    printf("\n  El resultado es...: %d\n", res);

    printf("\n Pulse una tecla para cerrar la aplicacion..."); getchar();
    return 0;
}


Saludos :)

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

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re:Duda con puntero a función en lenguaje C.
« Respuesta #2 en: Jueves 26 de Septiembre de 2013, 22:44 »
0
excelente explicación profe pero también otra diferencia no sería en el uso de memoria total porque si yo tengo una struct con bastantes campos no es lo mismo pasarlo por copia y duplicar la memoria que pasarlo por puntero y trabajar sobre la misma area de memoria que se habia definido antes? :think:.

ya se que las PC's actuales tienen memoria para derrochar pero a mi me enseñaron que había que exprimir la memoria al máximo xD

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Duda con puntero a función en lenguaje C.
« Respuesta #3 en: Viernes 27 de Septiembre de 2013, 00:23 »
0
Hola ProfesorX
Tenes mucha razón,  me compilaba con resultado óptimo en Dev-C++,  cuando alguien me advirtió que con otros IDE(compilador) el resultado era erróneo descargue Turbo C++ 4.5 y verifique que realmente me daba cualquier número, espero que el turbo C++ tenga un buen compilador.-
Maravilloso era lo que quería aprender, cambiar valores declarados en la función principal y mediante una función cambiar los mismos  siendo esta void.-
Una cosita mas (tengo un mambo importante con esto), yo haria esto:
Código: [Seleccionar]
int a = 5, b = 9, res, *pa = &a, *pb = &b;Porque tu código utilizas los *(* contiene el valor de la variable y & contiene la dirección de memoria de la misma)sin declarar y asignar los apuntadores y funciona?.-
Gracias herzdark por tu aclaración.-

Un gran abrazo a ambos.-
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Duda con puntero a función en lenguaje C.
« Respuesta #4 en: Viernes 27 de Septiembre de 2013, 01:12 »
0
excelente explicación profe pero también otra diferencia no sería en el uso de memoria total porque si yo tengo una struct con bastantes campos no es lo mismo pasarlo por copia y duplicar la memoria que pasarlo por puntero y trabajar sobre la misma area de memoria que se habia definido antes? :think:.

ya se que las PC's actuales tienen memoria para derrochar pero a mi me enseñaron que había que exprimir la memoria al máximo xD

Claro, es mucho mas eficiente trabajar directamente con las variables que con una copia, aunque hay algo que debes tener en cuenta, todo depende de lo que necesites hacer, si no vas a realizar modificaciones en los valores, o si los modificas, pero no te afecta en el resultado que debas obtener, entonces puedes usar directamente apuntadores. Si vas a realizar modificaciones en los valores pero por alguna razon te afecta el resultado que necesitas obtener, o necesitas conservar los valores anteriores, entonces necesitas trabajar con una copia si o si.

Cita de: DanielC#
Porque tu código utilizas los *(* contiene el valor de la variable y & contiene la dirección de memoria de la misma)sin declarar y asignar los apuntadores y funciona?.-

No entendi bien la pregunta, podrias elaborarla o explicarla mejor?

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

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re:Duda con puntero a función en lenguaje C.
« Respuesta #5 en: Viernes 27 de Septiembre de 2013, 03:17 »
0

Claro, es mucho mas eficiente trabajar directamente con las variables que con una copia, aunque hay algo que debes tener en cuenta, todo depende de lo que necesites hacer, si no vas a realizar modificaciones en los valores, o si los modificas, pero no te afecta en el resultado que debas obtener, entonces puedes usar directamente apuntadores. Si vas a realizar modificaciones en los valores pero por alguna razon te afecta el resultado que necesitas obtener, o necesitas conservar los valores anteriores, entonces necesitas trabajar con una copia si o si.


tenes bastante razon igualmente ya por habito cualquier struct la paso con apuntadores y si por alguna razon no desea modifarlo uso la palabra const y para lo otro la trato de usar local asi vive dentro de la vida util de la función



Cita de: DanielC#
Porque tu código utilizas los *(* contiene el valor de la variable y & contiene la dirección de memoria de la misma)sin declarar y asignar los apuntadores y funciona?.-

No entendi bien la pregunta, podrias elaborarla o explicarla mejor?

si no entendi mal el esta hablando sobre esto

Código: C
  1. void suma(int *a, int *b, int *res)
  2. {
  3.     *a = 10; *b = 10;
  4.     *res = *a + *b;
  5. }
  6.  

el asterisco (*) delante de cualquier variable tipo puntero significa que el contenido de la posición de memoria que tiene
para que lo entiendas hagamoslo a lo criollo:

suponiendo que en la memoria principal la variable A del main esta en la posición 0x100 y cuando uno llama a una función el compilador crea una porción de memoria para esa invocación y la variable local de la función que se llama A esta en la pos 0x1010 entonces al hacer *a=10 seria decir esto debe asignar 10 al contenido de la variable A pero A es un puntero a una porcion de memoria, entonces toma el contenido de esa variable que es 100 y en esa posición guarda un 10, en otras palabras es una asignación indirecta
« última modificación: Viernes 27 de Septiembre de 2013, 03:20 por herzdark »

DanielC#

  • Miembro activo
  • **
  • Mensajes: 39
  • Nacionalidad: ar
    • Ver Perfil
Re:Duda con puntero a función en lenguaje C.
« Respuesta #6 en: Viernes 27 de Septiembre de 2013, 23:58 »
0
Hola a todos.
Bien lo entendí viendo otros ejemplos y con la ayuda de Uds.  Lo tengo claro.-

Gracias y saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-