Programación General > C/C++
Duda con puntero a función en lenguaje C.
DanielC#:
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 ---#include <stdio.h> int suma(int a, int b, int *res){ *res = a + b;} int main(void){ int a = 5, b = 9, res; res = suma(a,b,&res); printf("\n El resultado es...: %d\n", res); printf("\n Pulse una tecla para cerrar la aplicacion..."); getchar(); return 0;}
--- Código: C ---#include <stdio.h> int suma(int *a, int *b, int *res){ *res = *a + *b;} int main(void){ int a = 5, b = 9, res, *pa = &a, *pb = &b; res = suma(&a,&b,&res); printf("\n El resultado es...: %d\n", res); printf("\n Pulse una tecla para cerrar la aplicacion..."); getchar(); return 0;}
Bueno espero aclaración.-
Saludos.
Daniel
ProfesorX:
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: ---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;
}
--- Fin del código ---
--- Código: ---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;
}
--- Fin del código ---
Saludos :)
herzdark:
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#:
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: ---int a = 5, b = 9, res, *pa = &a, *pb = &b;
--- Fin del código ---
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
ProfesorX:
--- Cita de: herzdark en Jueves 26 de Septiembre de 2013, 22:44 ---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
--- Fin de la cita ---
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?.-
--- Fin de la cita ---
No entendi bien la pregunta, podrias elaborarla o explicarla mejor?
Navegación
[#] Página Siguiente
Ir a la versión completa