Doy por echo que algo de punteros ya sabes.
para c++ y solo c++, cuando se refiere a referencia no es lo mismo que puntero.
Primero debo explicar que es referencia y que es puntero.
una referencia se crea asi:
int &ref = variable;
y un puntero se crea asi:
int *ptr = &variable;
Pero el puntero tambien lo puedes crear asi:
int *ptr = NULL;
ptr = &variable;
Sin embargo la referencia no puedes hacer:
int &ref = NULL;
ref = variable;
...o:
int &ref = NULL;
ref = &variable;
Nada de eso... solo puedes hacer lo primero:
int &ref = variable;
Tener claro 2 cosas. un puntero no es mas que una variable ¿ok? Es una variable que apunta a una dirección de memoria. Si es variable podemos cambiar a la dirección a la que apunta ¿Correcto?
Sin embargo las referencia no puedes cambiar a lo que apunta. Se define y se inicializa al mismo tiempo, o sea:
1º un puntero es una variable que apunta a otra variable.
2º una referencia es parecido a un puntero pero con la diferencia que no puedes cambiar lo que apunta, y por ese motivo se debe definir a lo que apunta a la hora de criarlo.
Esos son los 2 conceptos que debes acordarte siempre para que no te duela la cabeza ;).
Ahora veamos un par de ejemplos de como pasar una estructura con punteros y como pasarla con referencia.
1ºPuntero.
Código C++:
Ver original#include <iostream>
using namespace std;
//esta esra nuestra estructura de prueba. Simplemente va guardar una frase o palabra que la distinga de las demas ;)
struct foo{
string frase;
};
//esta es la funcion que usaremos para pasar la estructura por punteros
void bar(struct foo *foobar ){
//recibimos un puntero que apunta donde esta la estructura en memoria
cout << "Recibimos en la funcion bar: "<< foobar->frase << endl << endl; // observacion: si paso la estructura por puntero accedo a su variable miembro interna con el operador -> en ves de punto(lo entenderas cuando veas el puntero this de momento no te preucupes entenderlo si aun no llegaste en THIS POINTER).
//ahora vamos a modificar lo que tiene para provar que estoy modificando el original y no una copia como lo que acontece cuando pasamos una estructura por valor
foobar->frase = "\"Dale like y suscribete a mi canal XDD\"";
//al final de todos los ejemplos te dejo un ejemplo al que demostro que si pasas por valor una estructura, estas pasando una copia.
cout << "La estructura ahora contiene: "<< foobar->frase << endl;
cout << "Pulse enter para salir de la funcion bar()";
cin.ignore();
}
int main () {
//creamos un objeto de la estructura foo y lo llamamos f
struct foo f;
//ponemos algo en esa estructura para que la distinga de las demas
f.frase = "Hola mundo";
//pasamos la estructura a la funcion
bar(&f);
//de vuelta a main
cout << "\nYa estamos de vuelta en main! Pulse enter para seguir" << endl;
cin.ignore();
//Si la frase de la estructura f ha sido modificada realmente imprimira lo que la hemos metido en la funcion bar(), si no es asi imprimirá "hola mundo"
cout << f.frase << endl;
//si a esta altura ha imprimido "Hola mundo" nuestro trabajo ha salido malo pero si imprimio "Dale like y suscribete a mi canal XDD" pues eso XD "Dale like y suscribete a mi canal XDD"
return 0;
}
2º Referencia
Código C++:
Ver original#include <iostream>
using namespace std;
//esta esra nuestra estructura de prueba. Simplemente va guardar una frase o palabra que la distinga de las demas ;)
struct foo{
string frase;
};
//esta es la funcion que usaremos para pasar la estructura por referencia
void bar(struct foo &foobar ){ //notese que aqui uso el operador & a la hora de declarar y no * como en los punteros. foobar esta "vinculado" con la estructura f de main y no se puede reasignar otra estructura como en los punteros
//recibimos una referencia a la direccion de la estructura(los cambios se hacen en la misma estructura como los punteros)
cout << "Recibimos en la funcion bar: "<< foobar.frase << endl << endl; // observacion: no uso -> sino punto normal ;)
//ahora vamos a modificar lo que tiene para provar que estoy modificando el original y no una copia como lo que acontece cuando pasamos una estructura por valor
foobar.frase = "\"Dale like y suscribete a mi canal XDD\"";
//al final de todos los ejemplos te dejo un ejemplo al que demostro que si pasas por valor una estructura, estas pasando una copia.
cout << "La estructura ahora contiene: "<< foobar.frase << endl;
cout << "Pulse enter para salir de la funcion bar()";
cin.ignore();
}
int main () {
//creamos un objeto de la estructura foo y lo llamamos f
struct foo f;
//ponemos algo en esa estructura para que la distinga de las demas
f.frase = "Hola mundo";
//pasamos la estructura a la funcion (por referencia) NOTA: no debo poner el operador & delante como hago con punteros, la referencia ya espera la direccion asi que no tengo por que poner & ;)
bar(f);
//de vuelta a main
cout << "\nYa estamos de vuelta en main! Pulse enter para seguir" << endl;
cin.ignore();
//Si la frase de la estructura f ha sido modificada realmente imprimira lo que la hemos metido en la funcion bar(), si no es asi imprimirá "hola mundo"
cout << f.frase << endl;
//si a esta altura ha imprimido "Hola mundo" nuestro trabajo ha salido malo, pero si imprimio "Dale like y suscribete a mi canal XDD" pues eso XD "Dale like y suscribete a mi canal XDD"
return 0;
}
3º paso por valor
"paso de copias" Nada recomendable para estructuras grandes que te pueden llenar rápidamente la memoria.
Código C++:
Ver original#include <iostream>
using namespace std;
//esta esra nuestra estructura de prueba. Simplemente va guardar una frase o palabra que la distinga de las demas ;)
struct foo{
string frase;
};
//esta es la funcion que usaremos para pasar la estructura por valor
void bar(struct foo foobar){
//recibimos una copia, realmente tiene lo mismo que la estructura f de main pero no es ella
cout << "Recibimos en la funcion bar: "<< foobar.frase << endl << endl; // observacion: no uso -> sino punto normal ;)
//ahora vamos a modificar la copia no la autentica, ya lo demostrare
foobar.frase = "\"Dale like y suscribete a mi canal XDD\"";
cout << "La estructura de copia contiene: "<< foobar.frase << endl;
cout << "Pulse enter para salir de la funcion bar(). \nEso no producira ningun cambio en la estructura original.";
cin.ignore();
//cuando salgamos de la funcion bar la estructura de copia se destruira y la autentica seguirá intacta.
}
int main () {
//creamos un objeto de la estructura foo y lo llamamos f
struct foo f;
//ponemos algo en esa estructura para que la distinga de las demas
f.frase = "Hola mundo";
//pasamos la estructura a la funcion (por valor) NOTA: lo que va recibir la funcion foo es una copia de la autentica funcion, los cambios realmente no se van a producir en la autentica sino en la copia.
bar(f);
//de vuelta a main
cout << "\nYa estamos de vuelta en main! Pulse enter para seguir" << endl;
cin.ignore();
//Si la frase de la estructura f ha sido modificada realmente imprimira lo que la hemos metido en la funcion bar(), si no es asi imprimirá "hola mundo"
cout << f.frase << endl;
//si a esta altura ha imprimido "Hola mundo" es que los cambios en la funcion bar no surten efectos en la estructura original. Si imprime"Dale like y suscribete a mi canal XDD" es que la estariamos modificando la original.
return 0;
}
Por ultimo dejo un ejemplo de como lo guardamos la estructura de copia en la original.
Código C++:
Ver original#include <iostream>
using namespace std;
//esta esra nuestra estructura de prueba. Simplemente va guardar una frase o palabra que la distinga de las demas ;)
struct foo{
string frase;
};
//notese que el tipo de retorno de la funcion es el tipo de la funcion foo:
foo bar(struct foo foobar){ //retornamos una estructura tipo foo ;)
foobar.frase = "\"Dale like y suscribete a mi canal XDD\""; //modificamos la copia
return foobar; //retornamos la copia. Debemos guardarla sino se perdera al salir de la funcion bar() y no tendria sentido la funcion en dicho caso
}
int main () {
struct foo f;
f.frase = "Hola mundo";
f = bar(f); //guardamos la estructura que retorna la funcion bar
cout << "\nYa estamos de vuelta en main! Pulse enter para seguir" << endl;
cin.ignore();
//Como ahora guardamos lo que nos retorno la funcion bar imprimira lo que habia alli que es "Dale like y suscribete a mi canal XDD" y no "Hola mundo"
cout << f.frase << endl;
return 0;
}
Bueno... eso es todo.
Aprenda todo sobre punteros, que no te quede dudas.
Si quieres llegar a ser un buen programador, los punteros son esenciales. Y es por ese motivo que todos se tiran a java a bandadas jajaja ya que según tengo entendido java no necesitas trabajar con ellos aun que si me parece que también se puede o yo que se jaja.
continua abajo jaja...