Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 22 Mayo 2016, 18:10 pm



Título: Demostración de porque los punteros se pasan a función por valor.[C]
Publicado por: NOB2014 en 22 Mayo 2016, 18:10 pm
Hola gente.
No quería molestarlos por esta nimiedad pero en realidad no logro realizar el código correcto para demostrarlo, en todos los manuales dice que los punteros se pasan a las funciones por valor, ¿es este un Ej. correcto para demostrarlo? porque estoy pasando el puntero y en main se modifica el valor al pasar un puntero a la función, y en el otro caso es correcto porque estoy pasando la variable "a" por referencia pasando la dirección de memoria.-

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void funcionCp(int *q);
  5. void funcionDm(int *q);
  6.  
  7.  
  8. int main( void ){
  9. int a=100, *p = &a;
  10.  
  11. funcionCp(p);
  12.  
  13. printf("\n Variable *p = %d", *p);
  14.  
  15. funcionDm(&a);
  16.  
  17. printf("\n Variable *p = %d", *p);
  18.  
  19. return 0;
  20. }
  21.  
  22. void funcionCp(int *q) {
  23. *q+=1;
  24. }
  25.  
  26. void funcionDm(int *q) {
  27. *q+=1;
  28. }

Saludos.


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: engel lex en 22 Mayo 2016, 18:15 pm
no entendi la explicación inicial

Citar
porque estoy pasando el puntero y en main se modifica el valor al pasar un puntero a la función, y en el otro caso es correcto porque estoy pasando la variable "a" por referencia pasando la dirección de memoria.-

no entiendo el conflicto, pasar por referencia es una manera discreta de pasar un puntero, incluso ves que *p=&a es decir perfectamente se puede ver que es lo mismo pasar *p que &a


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: AlbertoBSD en 22 Mayo 2016, 18:29 pm
El valor de un apuntador es la direccion de memoria del dato apuntado..

Si tienes problema con la sintaxis de punteros puedes cambiar el ejemplo por

Código
  1. void funcionCp(int *q) {
  2. q[0] +=1;
  3. }



Título: Re: Pasar puntero a función, por valor [C]
Publicado por: NOB2014 en 22 Mayo 2016, 18:30 pm
Gracia por ocuparte, voy a intentarlo en partes, porque con el barullo que tengo no logro explicarme, ¿es correcto que los punteros se pasan a las funciones por valor? -


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: SebaC en 22 Mayo 2016, 18:41 pm
Si los punteros se pasan por valor eso significa que el contenido ddl puntero (la dirección del objeto al que apunta) se copia eso significa que si cambia el valor del puntero en el cuerpo de la función el cambio no se refleja al salir de ella seguirá apuntando a la antigua dirección pero se puede cambiar el valor del objeto al que apunta.


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: AlbertoBSD en 22 Mayo 2016, 18:45 pm
La respusta de Sosar es la mas acertada y mejor explicada.. ;-) ;-)



Título: Re: Pasar puntero a función, por valor [C]
Publicado por: class_OpenGL en 22 Mayo 2016, 18:47 pm
En C no existe pasar por referencia. El concepto de referencia es de C++ (que yo sepa). Todo lo que le pasas a una función en C es por valor, es decir, se copia el parámetro a la pila.

Comúnmente (y para mi entender, erróneamente), se suele decir que cuando pasas un puntero por los parámetros de una función en C, se suele decir que estás pasando la variable a la que apunta ese puntero por referencia. Se dice esto porque el objetivo de pasar un puntero, o bien es para modificar la variable, o bien es para no ocupar mucho espacio en la pila, los cuales son los objetivos del paso por referencia. Sin embargo, no hay que confundir términos


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: NOB2014 en 22 Mayo 2016, 19:26 pm
Creo que en parte me cayo la ficha, díganme, el código que pongo a continuación demuestra correctamente que el paso de un puntero a función es por valor? . -
Sosar, realmente lo tuyo fue muy didáctico. -   
Alberto... me podes decir de donde sacaste esto, ¿cómo se mastica?
q[0] +=1;

Código
  1. #include <stdio.h>
  2.  
  3. void funcionCp(int *q);
  4.  
  5.  
  6. int main( void ){
  7. int a=100, *p = &a;
  8.  
  9. funcionCp(p);
  10.  
  11. printf("\n En main *p = %d", *p);
  12.  
  13.  
  14. return 0;
  15. }
  16.  
  17. void funcionCp(int *q) {
  18.   q++;
  19. }
  20.  
  21.  
  22.  
Mucha gracia al resto que me ayudo a entender un poco más de los punteros. -
Un abrazo.


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: MAFUS en 22 Mayo 2016, 19:43 pm
Realmente, cuándo te dicen que un puntero se pasa por valor te quieren decir esto:
Código
  1. #include <stdio.h>
  2.  
  3. void f(int *p) {
  4.    printf("La dirección de p en f()    : %p\n", p);
  5. }
  6.  
  7. int main()
  8. {
  9.    int a;
  10.    int *p = &a;    
  11.  
  12.    printf("La dirección de p en main() : %p\n", p);
  13.    f(p);
  14.  
  15.    return 0;
  16. }


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: AlbertoBSD en 22 Mayo 2016, 19:49 pm
Un apuntador tiene como valor una direccion de memoria..

En tus ejemplos simplemente es un solo valor al que apunta.

Sin embargo podria ser realmente la direccion de todo un  arreglo.

Curiosamente el valor del apuntador es igual a la direccion de memoria del primer elemento.

Si quieres probarlo ve el siguiente ejemplo.

Código
  1. int *arreglo = calloc(3,sizeof(int));
  2. printf("Direccion del arreglo completo: 0x%x",arreglo);
  3. printf("Direccion del elemento 0 del arreglo: 0x%x",&arreglo[0]);
  4. ...
  5.  

En mis videos de youtube tengo un video que habla de apuntadores dobles... ahi muestros sus valores y sus posiciones en memoria tal vez sea un poquitin enredoso pero podria ayudarte un poco


Título: Re: Pasar puntero a función, por valor [C]
Publicado por: NOB2014 en 22 Mayo 2016, 21:00 pm
Muy bien, me queda todo claro. ;-) ;-) ;-)
Saludos.