C/C++ Dudas parámetros

Iniciado por h0oke, 23 Mayo 2010, 16:00 PM

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

^Winder^

Os estais liando ;)

Mirad, si pasais un puntero como parámetro eso es un paso por valor del puntero... por tanto, las modificaciones que hagais al objeto dentro de dicha función se reflejarán en el objeto de fuera (por ser el mismo), pero si intentais cambiar el puntero dentro de dicha función solo estareis modificando una copia del puntero.

Encambio, si pasas un puntero por referencia y modificas el puntero dentro de la función, el cambio también se reflejará fuera :)

Buscad sobre 'paso por valor de puntero' y 'paso por referencia del puntero', y lo vereis mas claro ;)

En C como tal no existe el paso por referencia ni los objetos, simplemente, puedes pasar punteros a variables, en C++ sí es posible. De hecho aparte del tipo puntero  * también teneis el tipo referencia & ;)

Yo apoyo la esperanza de Caylees. Frenemos la Leucemia:
www.cayleeshope.com
Libertad conquistada.  (Justicia ;-))

h0oke

Bueno al fin y al cabo, todo eso es cierto... Pero mi duda era, ¿cuál es la forma correcta de pasar los valores por referencia en C++? Según estuve hablando queda a disposición de uno.

.:BlackCoder:.

Ahhh winder hablaba sobre el puntero... xD yo crei que decias que no se podia modificar el objeto...  >:D No capte, sorry...

Y no me acuerdo bien pero creo que es cierto... No se puede modificar el puntero en la funcion... a menos que lo pases como referencia... pero  eso si no recuerdo como... Si ponen ejemplos mejor jejeje...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




h0oke

Todo lo que dijeron es cierto, no estoy en nada desacuerdo... Pero para pasar objetos(en C++) y modificarlos entonces debería pasarlos con &?

.:BlackCoder:.

#14
Depende brother... si es una variable normal... pes si... Pero si son punteros, debes detenerte y pensar que cambios realizaras, si modificaras el puntero (le reservaras memoria, por ejemplo), pasalos por referencia, y si modificaras SOLO el objeto apuntado, no es necesario pasarlo por referencia...

Eso se hace creo que asi:
Código (cpp) [Seleccionar]
void funcionx(int *&p);

Y en C es algo con punteros dobles, como no se xD pero por ahi deben haber ejemplos...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




h0oke

Exactly... creo que la duda fue respondida, aunque se fue por una rama interesante también.

.:BlackCoder:.

Aunque aun no me he metido con listas, pilas y colas, he visto mas o menos como funcionan... En esos temas te daras cuenta que no te tienes que dar mala vida por lo de pasar punteros por referencia... ya que se asignan las direcciones...

Me explico declaran los objetos globales, retornan direcciones y se las dan al puntero (a la lista por ejemplo), trabajan con objetos (clases) y muchas otras formas de trabajar las direcciones, sin usar lo de "punteros por referencia"...

Weno te lo digo porque yo por ejemplo, nunca he hecho eso que tu dices... Y ya tenia unos 6 o 5 meses estudiando C++... Pero no esta demas saberlo... Lo que dije en el mensaje anterior lo saque de un foro... Pruebalo a ver como te va, y me avisas  :xD por eso uso tanto la palabra "creo"  :laugh:

Si no funciona me pongo a investigar sobre eso...

Pero pes espero que funcione porque hoy no toy de animo para estudiar...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Littlehorse

Usar referencias y punteros depende exclusivamente de lo que quieras hacer. No es algo que dependa del gusto del programador, ya que usar punteros en lugares donde una referencia basta es una mala practica.

Lo primero que hay que tener en cuenta es que una referencia no es un puntero.
Una vez que se asigna una referencia, no puede ser separada del objeto ya que la referencia no tiene entidad propia (a diferencia de un puntero) la referencia es inherente al objeto, es el objeto en si.

En cualquiera de los casos, siempre que uses parámetros no constantes en una función (como un puntero, no-const) estas implícitamente diciendo que dicha función no debe fiarse del valor, incluso, debe controlar que sea valido.

También hay que destacar que es bastante difícil lograr que una referencia sea NULL, por lo tanto siempre que necesites modificar la referencia y controlar si esta no es NULL, un puntero debería ser la mejor opción.

Como consejo -y creo que ningún programador de C++ va a decirte lo contrario- es que uses las referencias cuando puedas y uses los punteros cuando debas.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

.:BlackCoder:.

Ahora aclarenme una duda a mi  :P

Cuando asignas memoria a un puntero, en una funcion... ¿Esa memoria al salir de la funcion sigue perteneciendo al puntero?... Si el puntero es pasado como parametro y por referencia... Porque he visto ejemplos en listas, en los que la asignacion de memoria se hace, y el puntero se paso de forma normal... (por valor quise decir) Luego dicho puntero sigue teniendo la memoria asignada...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Littlehorse

Depende, necesito ver un ejemplo para responderte correctamente.

Por como lo expresas, supongo que es un ejemplo sencillo. En dicho caso, el puntero que tenga ámbito local a esa función desaparecerá cuando la función termine, por lo tanto si la dirección no se retorna o lo que estamos trabajando no es una referencia de algún objeto en otro lado, la dirección se pierde.

Pero como ya te dije, hay tantas formas de solventar esa problemática que tal vez una de ellas fue utilizada en el ejemplo que viste. Si queres, pone un ejemplo de la función y su llamada (sin obviar la declaración de los miembros involucrados) y lo vemos mas a fondo.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.