pasar por referencia un puntero

Iniciado por m@o_614, 12 Enero 2014, 03:15 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

Saludos, tengo unas dudas con respecto a por que en algunas ocasiones se tienen que pasar los punteros por referencias?? como cuando estas haciendo una lista enlazada y quieres insertar por la cabeza, por que tienes que pasar el puntero por referencia, que no se supone que el puntero ya almacena una direccion de memoria y que por lo tanto no es necesario pasarlo asi funcion(&cabeza).

gracias

vangodp

Cuando pasamos algo por referencia se crea una especie de vinculo.
Creo que eso es exclusivo de c++.
A la diferencia de los punteros las referencias solo se pueden inicializar a la hora de crearlas, con los punteros eso no pasa ya que después de inicializada puedes cambiar el valor y utilizar este puntero para otra cosa.
si hago un.
   int numero1 = 5;
   int numero2 = 10;
   int &refer = numero1;
   
   &refer = numero2;
   //&refer = &numero2; ni asi va funcionar(poner & delante de numero no sirve)
como ves si no lo inicializa a la hora de crear no te sirve de nada por que después no vas a poder cambiar el valor.
Otra ventaja es que no necesito poner & delante de la variable que va albergar, cuando veo & delante de la referencia ya se que esta esperando la dirección.

A cambio el puntero si lo puedo cambiar el lo que apunta.
   int numero1 = 5;
   int numero2 = 10;
   int *puntero = &numero1;//aquí le creamos y le asignamos valor y no es obligado hacer esto, se puede asignar después de crear.
   
   puntero = &numero2;//como ves le cambio el valor, pero tengo que poner & delante de numero2 para decir que cambio su dirección.
   
   cout << *puntero; //compruebo que funciona, en la referencia ni llegamos aquí.

La referencia es muy cómoda, se un parece un poco al puntero en el aspecto que puedo pasar la dirección de memoria pero solo a la hora de crearla ya que despues no me permite cambiar como los punteros.
Los punteros son mas flexibles pero me obligan a poner & o * delante segun lo que vaya hacer.
si lo que quiero es usar una sola vez esa conexión y que me apunte a una dirección en concreto a lo mejor me interesa mas la referencia, caso contrario mejor es el puntero.  :rolleyes:

rir3760

Cuando tengas una duda por favor indica el lenguaje de programacion.

En el caso de C ...

Cita de: m@o_614 en 12 Enero 2014, 03:15 AMpor que en algunas ocasiones se tienen que pasar los punteros por referencias?
Porque en C todo se pasa por valor.

Si se declara en la funcion "f" una variable "a" y se quiere modificar esta en otra funcion "g" se debe emular el paso por referencia. Eso aplica sin importar el tipo de la variable.

Cita de: m@o_614 en 12 Enero 2014, 03:15 AMcuando estas haciendo una lista enlazada y quieres insertar por la cabeza, por que tienes que pasar el puntero por referencia
Veamos:

1) Declaras en la funcion main la variable "primero" y esta almacena la direccion en memoria del primer nodo (por eso es un puntero).
2) Defines una funcion "insertar" y debe tener la capacidad de insertar en cualquier lugar, incluso modificando cual sera el primer nodo y por ello debe tener la capacidad de modificar una variable de otra funcion (la variable "primero" de la funcion main).

Es debido al punto 2 que debe pasarse su direccion en memoria.

Cita de: m@o_614 en 12 Enero 2014, 03:15 AMno se supone que el puntero ya almacena una direccion de memoria
Si pero lo que se necesita no es poder modificar el primer nodo sino modificar la variable que almacena ese valor (la variable "primero" de main).

Un ejemplo para explicarlo mejor:
#include <stdio.h>
#include <stdlib.h>

void fn(int **pa_p, int **pa_q);

int main(void)
{
   int a = 1;
   int b = 9;
   
   /* "p" apunta a "a", "q" apunta a "b" */
   int *p = &a;
   int *q = &b;
   
   /* Imprimimos los valores de los objetos apuntados */
   printf("%d %d\n", *p, *q);
   
   /* Se intercambian los valores de las variables "p" y "q" */
   fn(&p, &q);
   
   /* Imprimimos los valores de los objetos apuntados */
   printf("%d %d\n", *p, *q);
   
   return EXIT_SUCCESS;
}

void fn(int **pa_p, int **pa_q)
{
   int *aux;
   
     aux = *pa_p;
   *pa_p = *pa_q;
   *pa_q = aux;
}


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