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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  pasar por referencia un puntero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: pasar por referencia un puntero  (Leído 7,106 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
pasar por referencia un puntero
« en: 12 Enero 2014, 03:15 am »

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


En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: pasar por referencia un puntero
« Respuesta #1 en: 12 Enero 2014, 03:48 am »

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:


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: pasar por referencia un puntero
« Respuesta #2 en: 18 Enero 2014, 18:13 pm »

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

En el caso de C ...

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

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

no 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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void fn(int **pa_p, int **pa_q);
  5.  
  6. int main(void)
  7. {
  8.   int a = 1;
  9.   int b = 9;
  10.  
  11.   /* "p" apunta a "a", "q" apunta a "b" */
  12.   int *p = &a;
  13.   int *q = &b;
  14.  
  15.   /* Imprimimos los valores de los objetos apuntados */
  16.   printf("%d %d\n", *p, *q);
  17.  
  18.   /* Se intercambian los valores de las variables "p" y "q" */
  19.   fn(&p, &q);
  20.  
  21.   /* Imprimimos los valores de los objetos apuntados */
  22.   printf("%d %d\n", *p, *q);
  23.  
  24.   return EXIT_SUCCESS;
  25. }
  26.  
  27. void fn(int **pa_p, int **pa_q)
  28. {
  29.   int *aux;
  30.  
  31.     aux = *pa_p;
  32.   *pa_p = *pa_q;
  33.   *pa_q = aux;
  34. }

Un saludo
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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