[Solucionado] ¿Cambia el valor de una variable dentro una funcion?

Iniciado por Caster, 1 Octubre 2012, 19:31 PM

0 Miembros y 2 Visitantes están viendo este tema.

Stakewinner00

no entendi demasado pero me vendra bien para saber de k va

rir3760

Cita de: Caster en  1 Octubre 2012, 21:36 PM
Es exactamente el mismo codigo, es un copia y pega de lo que has posteado tu y me sigue dando el fallo.
Eso es debido a que la declaración de una referencia:
Código (cpp) [Seleccionar]
void modificar(int &a) {
Y la reserva de memoria mediante "new":
Código (cpp) [Seleccionar]
int *a = new int(2);
Son parte del lenguaje C++ (pero no de C).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

overxfl0w13

Cita de: rir3760 en  2 Octubre 2012, 15:55 PM
Eso es debido a que la declaración de una referencia:
Código (cpp) [Seleccionar]
void modificar(int &a) {
Y la reserva de memoria mediante "new":
Código (cpp) [Seleccionar]
int *a = new int(2);
Son parte del lenguaje C++ (pero no de C).

Un saludo

De todas formas el uso de punteros, las referencias y la reserva mediante new ha dicho que son puntos a tratar en próximos temas del libro que está siguiendo, nunca viene mal conocerlo :)
[/url]

leosansan

#13
Cita de: Caster en  1 Octubre 2012, 20:40 PM
Los punteros los tratan mas adelante en el libro que estoy leyendo, asi que voy a dejarlos para cuando toque, he compilado el codigo que has dejado
Sólo necesitas saber ahora que puedes pasar a una función un parámetro o variable  por valor -que es lo que has visto hasta ahora- y por referencia -que hace uso de punteros y es lo que te queda por ver-. La diferencia fundamental es que en el paso por valor, en la función donde está declarada la variable, su valor no cambia aún después de "pasar" por la función, mientras que en el paso por referencia sí puede cambiar el valor de la variable.
Te dejo el código funcionando para los dos métodos:
#include <stdio.h>

void modificar(int a)
{
a *= 3;
printf("\n\na = %d (desde la funcion, modificando el valor)", a);
return ;
}
void modificar1(int *a)
{
*a *= 3;
printf("\n\na = %d (desde la funcion, modificando el valor)", *a);
return ;
}
int main()
{

int *a = 2;
   printf("\n\nPaso por valor\n");
printf("\na = %d (desde main, antes de llamar a la funcion)", a);
modificar(a);
printf("\n\na = %d (desde main, despues de llamar a la funcion por valor)", a);
printf("\n\nPaso por referencia con puntero\n");
printf("\na = %d (desde main, antes de llamar a la funcion)", a);
modificar1(&a);
printf("\n\na = %d (desde main, despues de llamar a la funcion por referencia)", a);

printf("\n\na = %d (desde main, OTRA VEZ antes de llamar a la funcion)", a);
modificar1(&a);
printf("\n\na = %d (desde main, despues de llamar a la funcionpor referencia )", a);
getchar();
       return 0;
}

Por si te animas a empezar  a leer sobre punteros, aquí va un ejemplo:

#include <stdio.h>
int main() {
   int i=0,*puntero,*pmat;
   int valor = 52;
   int mat [10];
   mat[0]=10, mat[1]=30,mat[2]=50,mat[3]=60;
   puntero = &valor;
   printf("puntero apunta a %p\n", puntero);
   printf("la direccion de memoria de &valor es %p\n", &valor);
   printf("el valor de 'valor' es %d\n", valor);
   printf("el valor de aquello a lo que apunta *puntero es %d\n", *puntero);
   *puntero += 25;
   printf("el valor de aquello a lo que apunta *puntero += 25 es %d\n\n\n", *puntero);

   pmat=&mat[0] ;//<=== pmat "apunta=da" a la direccion de mat[0]
   printf("pmat apunta a la direccion %p\n\n", pmat);
   printf("el valor de aquello a lo que apunta *pmat=mat[0] es %d\n\n", *pmat);//10

   i=*++pmat;//<=== pmat "apunta" a la direccion de mat[1]
   printf("el valor de aquello a lo que apunta *++pmat=mat[1] es %d\n\n", i);//30

   i=*pmat+1;
   printf("el valor de aquello a lo que apunta *pmat+1=30+1 es %d\n\n", i);//31

   i=*(pmat+1);//<=== pmat "apunta" a la direccion de mat[2]
   printf("el valor de aquello a lo que apunta *(pmat+1)=mat[2] es %d\n\n", i);//50

   i=*++pmat;//<=== pmat "apunta" a la direccion de mat[2];
   printf("el valor de aquello a lo que apunta *++pmat=mat[2] es %d\n\n", i);//50

   i=*++pmat;//<=== pmat "apunta" a la direccion de mat[3]
   printf("el valor de aquello a lo que apunta *++pmat=mat[3] es %d\n\n", i);//60

   i=*pmat+5;//<=== pmat "apunta" a la direccion de mat[3]+5
   printf("el valor de aquello a lo que apunta *pmat+5=mat[3]+5 es %d\n\n", i);//65

   return 0;
}

Saludos!

Caster

Lo de paso por valor es de lo ultimo que he visto, ahora estoy con la recursividad, y ya he visto que el valor de variable solo cambia en la propia funcion, fuera no, lo de los punteros y esas cosas vienen explicadas mas adelante, asi que las vere cuando toque, muchas gracias a todos.

Saludos

leosansan

#15
Cita de: Caster en  3 Octubre 2012, 07:05 AM
lo de los punteros y esas cosas vienen explicadas mas adelante, asi que las vere cuando toque
Aunque te toque más adelante procura guardar los ejemplos que te postee, son clarificadores e incluyen aritmética de punteros. Por cierto, ¿Qué libro estas siguiendo para el estudio del C?.
Gracias y un saludo.

anonimo12121

es así para cambiar el valor de una variable puesta en el argumento.
Código (cpp) [Seleccionar]
tipo name(tipo &);


Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

0xDani

Cita de: Xafi en  3 Octubre 2012, 14:10 PM
es así para cambiar el valor de una variable puesta en el argumento.
Código (cpp) [Seleccionar]
tipo name(tipo &);




Estan hablando de C, no de C++.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Caster

#18
Pues el libro es Programacion en C de Byron Gottfried de la edicion Mc Graw Hill.

overfl0w13, por si lees esto, lo del alcance de las variables, varibles locales, globales, estaticas y eso que creo que es de lo que hablas es justo el tema siguiente en mi libro al de las funciones que estoy viendo ahora.

Saludos

overxfl0w13

Cita de: Caster en  3 Octubre 2012, 17:58 PM
Pues el libro es Programacion en C de Byron Gottfried de la edicion Mc Graw Hill.

overfl0w13, por si lees esto, lo del alcance de las variables, varibles locales, globales, estaticas y eso que creo que es de lo que hablas es justo el tema siguiente en mi libro al de las funciones que estoy viendo ahora.

Saludos

Pues píllalo con ganas la cosa se pone interesante :)
[/url]