elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Demostración de porque los punteros se pasan a función por valor.[C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Demostración de porque los punteros se pasan a función por valor.[C]  (Leído 4,744 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Demostración de porque los punteros se pasan a función por valor.[C]
« 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.


« Última modificación: 22 Mayo 2016, 21:02 pm por NOB2014 » En línea

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.-
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Pasar puntero a función, por valor [C]
« Respuesta #1 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


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar puntero a función, por valor [C]
« Respuesta #2 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. }

En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar puntero a función, por valor [C]
« Respuesta #3 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? -
En línea

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.-
SebaC

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Pasar puntero a función, por valor [C]
« Respuesta #4 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.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar puntero a función, por valor [C]
« Respuesta #5 en: 22 Mayo 2016, 18:45 pm »

La respusta de Sosar es la mas acertada y mejor explicada.. ;-) ;-)

En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Pasar puntero a función, por valor [C]
« Respuesta #6 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
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar puntero a función, por valor [C]
« Respuesta #7 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.
En línea

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.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Pasar puntero a función, por valor [C]
« Respuesta #8 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. }
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar puntero a función, por valor [C]
« Respuesta #9 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
« Última modificación: 22 Mayo 2016, 19:52 pm por AlbertoBSD » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines