Pregunta:
¿Duda programación en C?
2010-05-06 04:16:36 UTC
Tengo una duda en cuanto al paso de parámetros por referencia y por valor.
Cuando pasamos un parámetro por referencia no es necesario poner un 'return' ya que los punteros nos devuelven el valor que queramos a la función "main", y cuando pasamos un parámetro por valor, dicho parámetro solo nos sirve para la función a la cual llamamos.
Mi duda es: ¿Qué debemos hacer para que el valor que hemos cambiado en la función llamada nos valga también para la función "main"?
Tres respuestas:
aem
2010-05-06 06:34:16 UTC
Hola:

Cuando pasamos un puntero como parámetro de una función por valor pasa lo mismo que con cualquier otro objeto.



Dentro de la función trabajamos con una copia del parámetro, que en este caso es un puntero. Por lo tanto, igual que pasaba con el ejemplo anterior, las modificaciones en el valor del parámetro serán locales a la función y no se mantendrán después de retornar.



Sin embargo, no sucede lo mismo con el objeto apuntado por el puntero, puesto que en ambos casos será el mismo, ya que tanto el puntero como el parámetro tienen como valor la misma dirección de memoria. Por lo tanto, los cambios que hagamos en los objetos apuntados por el puntero se conservarán al abandonar la función.

Mas referencias y ejemplos en: http://c.conclase.net/curso/?cap=015b



En la preactica, el pasar valores por referencia, a mi entender es semejante al uso de variales globales o sea resumiendo quedarian dos formas de recuperar el valor en el main:

Cuando se hace la llamada a la funcion, alli esta tambien el resultado: modelo funcion que devuelve



int suma(int nume1, int nume2)

{return(nume1 +nume2);} /*los valores nume1 y nume2 son locales, no conservan su valor al salir de la funcion*/



en el main, se pone

ingrese nu1

................

ingrese nu2

................

mostrar resultado= suma(nu1,nu2);



si resultado es publico no hace falta que la funcion devuelva, lo mismo al operar sobre punteros



variable publica resultado (semejante a usar un puntero para guardar el resultado o sea por referencia)



void suma(int nume1, nume2)/*nume1 y nume2 pueden ser punteros (paso por reerencia)*/

{resultado=nume1+nume2;}/*nume1 y nume2 son locales, resultado es publica*/

/*para que resultado conserve su valor, tiene que se publica, sea puntero o valor*/



en el main

ingrese nu1 /*nu1 puede ser un puntero*/

ingrese nu2 /*nu2 puede ser un puntero*/

suma(nu1,nu2);

mostrar resultado;





Espero que aclare el tema

Dios te bendiga

Saludos

Antonio
?
2010-05-06 18:32:06 UTC
void funcion( int *n){

*n=5;}

int main(){

int m;

funcion(&m);

return 0;}

para hacer eso simplemente usa punteros, en este ejemplo muestra como en la funcion recibo la direccion de "m" en un puntero "n" y luego le asigno el valor 5 a "n" esto tambien va a valer para el main en "m" tambien va a valer 5. solo hay que tener en cuenta que en la funcion pones el puntero com parametro (*), en este ejemplo "n" y en el main cuando llamas a la funcion mandas el valor antes poniendo & en este ejemplo "m" le pones antes &.
Zóram
2010-05-06 13:17:30 UTC
La cuestión está en que los apuntadores necesitan dos símbolos, como bien es sabido (& *). Cuando haces una función es algo así:



void suma(int a, int b, int *c)

{

.

.

.

}



cuando la llamas es así:



suma(num1, num2, &num3);



Ahora bien, creo que lo que preguntas es esto. Para que num3 tenga la suma de num1 y num2 la función "suma" debe ser así:



void suma(int a, int b, int *c)

{

*c = a +b;

}



Si te fijas c todavía debe tener el asterisco incluso dentro de las llaves, porque sigue siendo un apuntador que indica a la variable num3 y que es en ese lugar donde debe poner el valor de a + b.



Ahora bien, quizá tu duda sea la siguiente: también se puede mezclar 'return' con valores por referencia:



int suma(int a, int b, int *c);



int main(void) // void opcional

{

int num1 = 1, num2 = 2, num3 = 3; num4 = 4;



num4 = suma(num1, num2, &num3);



return (0); // opcional

}



int suma(int a, int b, int *c)

{

int d;



*c = a + b;



d = a - b;



return (d); // puedes poner *c entre los paréntesis si lo deseas

}


Este contenido se publicó originalmente en Y! Answers, un sitio web de preguntas y respuestas que se cerró en 2021.
Loading...