Foros del Web » Programación para mayores de 30 ;) » C/C++ »

punteros y referencias

Estas en el tema de punteros y referencias en el foro de C/C++ en Foros del Web. Buenas noches... tengo una inquietud acerca de punteros y referencias. cuando se deben usar y cuando no. Sè darles uso (referencias para direcciones y punteros ...
  #1 (permalink)  
Antiguo 31/01/2014, 17:50
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
punteros y referencias

Buenas noches...
tengo una inquietud acerca de punteros y referencias.
cuando se deben usar y cuando no.

Sè darles uso (referencias para direcciones y punteros para señalar direcciones).

Pero no logro entender mucho, y me temo que cada que quiero ir mas a fondo me
confundo un poco mas solo por que no entiendo cuando darles uso y cuando no.

Saludos.
Gracias
  #2 (permalink)  
Antiguo 31/01/2014, 19:08
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: punteros y referencias

La diferencia uno de otro es que:
La referencia la debes asignar a la hora de crear.
int &referencia = foo; // ¡Correcto!, no tengo que poner el &delante de foo por que ya se que espera la dirección.
referencia = bar; //(¡INCORRECTO!) No se puede asignar otra dirección, solo a la hora de crear como en el caso antes descrito.

El puntero si puedes "reutilizar":
int *puntero = &bar; // ¡Correcto! Puntero se crea de manera distinta: si veo el * a la hora de crear el puntero debo pasar la & (dirección).
Al igual que la referencia "ambos" (tanto referencia como puntero) esperan la dirección del objeto(variable) a modificar.
puntero = &foobar; // ¡Correcto! Puedo re aprovechar puntero cuantas veces quiera re asignándoles la dirección de otra variable.
Los punteros no son tan cómodos como las referencias pero tienes mucho mas poder.

Digamos que la referencia produce una conexión con la variable y es irrompible "conectas la referencia a la variable cuando creas la referencia", es mas bien como dar un apodo a la variable, los apodos no pueden cambiar de persona ;) ( haces referencia a la variable ).

El puntero es "una variable" que contiene la dirección de otra variable, lo que le permite cambiar a lo que apunta durante su creación y también después de su creación.

El puntero da mucho mas juego que las referencias, pero las referencias pueden llegar a ser mas simples de usar.
Si lo que quiero es pasar algo y esperar que me lo retorne el resultado quizás la referencia por comodidad.
Pero si tengo que apuntar una cosa y después otra el puntero me da mas poder ( Poderes conllevan una gran responsabilidad O.o ¿Donde lo vi? XD).
Las referencias son exclusivas de c++.

Última edición por vangodp; 31/01/2014 a las 19:34
  #3 (permalink)  
Antiguo 01/02/2014, 07:52
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: punteros y referencias

Muchas gracias compañero...
Ahora entiendo un poco mas.

Pero mi otra duda es ¿por que utilizar un puntero que apunte a otro puntero en la estructuracion dinamica?, como por ejemplo.

Código C++:
Ver original
  1. typedef class  claseLista lista;[COLOR="Green"]//se crea el objeto[/COLOR]
  2. typedef lista *ptrLista;[COLOR="Green"]//se crea un puntero de tipo lista[/COLOR]
  3.  
  4. void ClaseLista::insertar(ptrLista p){
  5. ptrLista nuevo;[COLOR="green"]puntero de tipo ptrLista[/COLOR]
  6. nuevo->p;[COLOR="green"]//puntero que apunta a puntero?[/COLOR]
  7. [COLOR="green"]//resto de la funcion[/COLOR]
  8. }

¿por que no puedo hacer una simple autoreferencia y luego usar esa autoreferencia para enlazar los objetos de esa estructura?.

Código C++:
Ver original
  1. class ClaseLista{
  2. ClaseLista *autoReferencia;[COLOR="green"]//autoreferencia[COLOR="green"]
  3. }
  #4 (permalink)  
Antiguo 01/02/2014, 08:12
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: punteros y referencias

Amigo..... :D
Hay que ser sincero jeje
No llego a tanto XD
Eso ya me supera, a ver si alguien te lo puede explicar mejor que yo.
Solo se que si se puede hacer punteros a punteros a punteros a punteros de forma indefinida.
Solo el que lo creo sabe por que lo hizo así :D
Prueba convertir el programa a tu manera y mira si tiene el mismo efecto ;)
Y esperamos que alguien que tenga mas idea que yo te lo esclarezca el tema. :D
Lo siento

Última edición por vangodp; 01/02/2014 a las 08:20
  #5 (permalink)  
Antiguo 01/02/2014, 09:26
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: punteros y referencias

No se si el tema tiene que ver algo con el puntero this, y aun no eh llegado ahi :D
  #6 (permalink)  
Antiguo 01/02/2014, 10:49
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: punteros y referencias

Gracias por tu intencion de ayudarme y ...
No te preocupes.

Sin embargo yo sigo con mi indagacion de programacion dinamica.

Hasta luego.
  #7 (permalink)  
Antiguo 01/02/2014, 18:52
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: punteros y referencias

Te conviene mas pensar que los punteros guardan direcciones de memoria, no que guardan otros punteros.

Si piensas que los punteros guardan direcciones de memoria como te propongo, entonces es valido que un puntero guarde la direccion de si mismo, de otro objeto del mismo tipo, de otro objeto de otro tipo, etc. lo que es cierto en C++.

Aunque es cierto que en un puntero se puede guardar cualquier direccion de memoria, lamentablemente no es cierto que despues la puedes usar validamente. Solo es valido y razonable guardar direcciones de memoria de datos tal como definiste el puntero.

Código C++:
Ver original
  1. int i;
  2. char c;
  3. char *p;
  4.  
  5. p = &c;  // valido y razonable
  6. p = &i;  // valido, pero peligroso, el compilador posiblemente genere un warning

Finalmente, cuando tienes 2 nodos distintos en una cola por ejemplo, uno de ellos puede tener como dato un puntero, es decir, guardador de direcciones de memoria, y guardar la direccion de memoria del nodo siguiente, del anterior, del mismo, del ultimo, etc.

El tema es mas largo de explicar, pero creo que esto es la base que necesitas para entender mas.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 02/02/2014 a las 19:35
  #8 (permalink)  
Antiguo 03/02/2014, 17:57
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: punteros y referencias

Es decir...
Debo poner en mi mente el grafico de una direccion de memoria y que los punteros apuntan es a esas direcciones, en vez de pensar que apuntan es a otros punteros?.

Entiendo un poco mas...
  #9 (permalink)  
Antiguo 03/02/2014, 18:20
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: punteros y referencias

Código C++:
Ver original
  1. //Podrian decirme por que no puedo usar la autorefencia de la clase para apuntar
  2. //a un objeto que  quiero insertar  o hacer otra accion, en vez de
  3. //utilizar una puntero de tipo ptrLista?.
  4. //ejemplo
  5.  
  6. class Lista{
  7. int info;
  8. Lista *sig;
  9. }
  10. void insertar(lista *p,int n){//suponiendo que p apunta al ultimo elemento de la lista
  11. lista nuevo=new (Lista);
  12. nuevo->info=n;
  13. nuevo->sig=Null;
  14. p->sig=nuevo;
  15. p=nuevo;
  16. }
  17.  
  18.  
  19. //EN VEZ DE CREAR UN OBJETO P DE TIPO PUNTERO QUE APUNTE AL PUNTERO DEL
  20. //ARGUMENTO Y NO A LA AUTOREFERENCIA QUE DECLARÈ EN LA CLASE?
  #10 (permalink)  
Antiguo 04/02/2014, 03:41
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: punteros y referencias

Hola:

Si no me equivoco, el motivo por el que no funciona lo que dices es porque estás intentando crear un objeto estático y usarlo. Pero los objetos dentro de la función, como cualquier otra variable, mueren cuando se sale de la función.

Parece que lo intentas arreglar declarando el objeto estático de forma dinámica, con new. No sé si esto compila, pero sigue sin ser un método correcto. El método correcto, es, efectivamente, que el puntero que se crea en la función haga la reserva de memoria y entonces sí existirá esa zona de memoria una vez salgas de la función. De la otra forma, si es que compila, te dará un error de segmentación o algo así.

Veamos:
Código C++:
Ver original
  1. void insertar(lista *p,int n){//suponiendo que p apunta al ultimo elemento de la lista
  2. lista nuevo;
  3. nuevo.info=n;
  4. nuevo.sig=Null;
  5. p->sig=nuevo;
  6. p=nuevo;
  7. }

Primero la función insertar() crea el objeto nuevo. En este paso se hace la reserva de memoria pero como un objeto local a la función.
Luego se le hacen las asigaciones a nuevo.info y a nuevo.sig.
Y por último le das a p la dirección de nuevo.
Pero cuando salgas de la función, el objeto nuevo desaparece, y p apuntará a un sitio no válido.
Otra cosa es si haces:
Código C++:
Ver original
  1. lista* nuevo=new (Lista);

Aunque el puntero desaparece, la reserva de memoria permanece, y si antes de que desaparezca el puntero has enlazado el último elemento de la lista a ese nuevo elemento, la cosa debería de funcionar.
(Otra cosa es que la función insertar() maneja un puntero del tipo lista, lo que no podrás usar para dirigirlo a un objeto del tipo Lista)

No sé si realmente he contestado tu duda. Pero seguro que alguien habrá que te pueda ayudar mejor que yo.

Saludos !
  #11 (permalink)  
Antiguo 04/02/2014, 06:27
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: punteros y referencias

Ademas de lo indicado previamente, en C y C++ el default es el paso por valor, de modo que cualquier función no modifica lo que recibe como parámetro

Código C++:
Ver original
  1. void f( Tipo v ) {
  2.    v = 4;  // se modifica una copia
  3. }
  4.  
  5. // mas tarde
  6.  
  7.     miVariable = 0;
  8.     f( miVariable );   // se invoca la función "cambiadora", cambia miVariable?
  9.     // miVariable sigue valiendo 0
lo que también ocurre con los punteros
Código C++:
Ver original
  1. void f( Tipo* v ) {
  2.    v = <cualquier expresion>;  // se modifica una copia
  3. }

pero si está permitido modificar lo apuntado por los punteros, usándolos a ellos para llegar a los datos

Código C++:
Ver original
  1. void f( Tipo* v ) {
  2.    v->dato = <cualquier expresion>;  // se modifica el dato!
  3. }

La soluciones que se pueden aplicar aquí, para modificar los punteros, pueden ser:
- retornar el puntero e invocar la función de acuerdo a esta definición
Código C++:
Ver original
  1. T* f( T* v )
  2. {
  3.     v = <nueva expresion>;  // no se modifica v
  4.     return v;
  5. }
  6.  
  7. // y luego
  8.      miPuntero = f( miPuntero );

- o bien pasar un puntero a puntero y desreferenciarlo al asignar

Código C++:
Ver original
  1. void f( T** pv )
  2. {
  3.     *pv = <nueva expresion>;  // se modifica lo apuntado por v
  4. }
  5.  
  6.  
  7. // y luego
  8.  
  9.     T* puntero;
  10.  
  11.     f( & puntero );

En C++ también existe el paso por referencia, pero esto esconde un poco, en el momento de la invocación, el hecho que la función modificará el puntero.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 04/02/2014 a las 11:39
  #12 (permalink)  
Antiguo 04/02/2014, 15:43
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: punteros y referencias

Ok. Entendì.
Es decir primero tenia que haber reservado memoria para que en ella quepa el objeto que nesecito (LISTA), new (Lista), dinamicamente.

Lo otro es que siempre me queda un poco dificil hacer que el argumento me que apuntando al ultimo elemento de la lista.
  #13 (permalink)  
Antiguo 04/02/2014, 15:45
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: punteros y referencias

Y estar plenamente seguro de que el argumento es diferente de null.

Etiquetas: punteros, referencias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:01.