25.12.12

Punteros (a.k.a. *) vs Referencias (a.k.a. &)

Durante mis lecciones de C++ impartidas amablemente por Moises(a.k.a. Moy) en uno de esos lindos veranos estudiantiles cuando aun no trabajaba, aprendi que C++ provee una nueva manera de manejar las variables que se pasan a las funciones, de modo que podiamos deshacernos de los "malvados punteros"... Y en un principio me parecio la mejor solucion, dado que te evitabas la ch1n64 friega de pensar en apuntadores.

Y cual era esencialmente la gran diferencia entre referencias y apuntadores?


Pues que en vez de tener que dereferenciar el apuntador para cambiar el valor de una variable (*identificador), podias hacerlo como se de la mismisima variable que es pasada como parametro se tratara, asi como todos nosotros ingenuos intentamos cambiar una variable en una funcion y nos dimos cuenta de que no cambiaba pura m4dr3 para nada, y entonces la solucion que nos daban era que la funcion devolviera el nuevo valor y la llamaramos estilo:

variable = miFuncionBienPirata(variable, parche, pataDePalo, loro);

Dada la definicion de la funcion:

int miFuncionBienPirata(int variable, struct Parche, struct PataDePalo, struct Loro);

Pues bien, si queriamos cambiar "variable" en la funcion, se nos mostro que era algo asi:

void JackSparrow(int *variable){
  *variable = loQueTimBurtonTengaEnElGuion;
}



Stroustrup dandole las 10 tablas de C++ a Moises.







Pero pues muchos de la carrera se hacen bolas desde segundo y hasta que salen con los dichosos apuntadores, cosa que se me hace increible dado el grado educativo en el que nos encontramos. Y entonces Stroustrup dijo al crear C++:

"Hagase el paso por referencia, para que los tontos n00bs programadores ineptos inexpertos puedan librarse de los apuntadores y puedan de perdis titularse..." (o algo asi.)



El chiste es que nos dio permiso de usar la siguiente sintaxis:

void JackSparrow(int &variable){
  variable = loQueTimBurtonTengaEnElGuion;
}

Ayyy guuuuueeeee caray! "Y que implicaciones tiene ese ampersand (asi se llama el pretzel deforme ese "&")antes de la variable???", preguntaran los reggaetoneros licenciados no-programadores, "pero eso se usa para sacarle la direccion a una variable" diran los disque entendidos de C... Recordemos que aqui yo les digo y ustedes aprenden... :D

 
Asi lucia Hamtaro al enterarse del uso de referencias
Entonces dejenme iluminarlos, el preztel mordido ampersand cuando se antepone a la declaracion de una variable, la declara como una referencia, es decir, una variable cuya direccion apunta a donde mismo que otra variable (sin apuntador de por medio). Y pues ya la libramos de los apuntadores!!! Ahora si la modifican modifican la que pasaron por parametro!!! Awww Yeaaah!!!

Y como se usa??? Papita!!!

// Here be Krakens
int kraken;

JackSparrow(krakens);

// No Krakens in sight, Captain! Ahoy!!!



No entiendes el uso de apuntadores?

Y no faltara quien llore y patalee diciendo "pero se la estas pasando por valor!!!"... No le hagan caso a esa gente, escucha reggaeton y seguro en su Facebook estan registrados como PriInChexHXzhiTo emMozxhiTOp... D:
Es el milagro de C++, puede ayudarte a reconocer cuales amigos son reggaetoneros librarnos de apuntadores... Pues les vengo a aguar el orgasmo computacional que tuvieron al enterarse de esto (porque se que lo tuvieron).

El simple hecho de que una referencia no pueda contener un valor NULL, hace que me parezcan inutiles (y les dire porque).



Mas de alguna vez vamos a necesitar saber si una de esas referencias son NULL, nos tenemos que hacer a la idea de que los apuntadores no son inevitables, son parte del lenguaje y en particular, en C++ son el pan de diario si vamos a aprovechar el polimorfismo que nos ofrece su orientacion a objetos. A lo mejor les parece que mi postura es extremista estilo musulman radical, y lo es... Pero es que yo prefiero saber que estoy manejando un apuntador a no saber si la variable se paso por referencia o por valor y estar releyendo el codigo para saberlo, ademas me gusta complicarme la vida y para lo de las referencias NULL, pueden pasar los apuntadores por referencia /* void funcion(int *&variable) */ y pueden evitarse la pena de tener que pasar dobles apuntadores y todo el show...

La decision es finalmente personal, cuestion de que hagas tus pruebas y programes como te gusta!!! :D A mi me gustan mis variables con muchos asteriscos (hentai citation needed /* If you know what I mean */) porque siento que asi se ve mas fancy el codigo, ademas de que soy amante de los apuntadores, y por llevarle la contraria a Moy, quien es cliente frecuente del Lipstick usuario asiduo de los pasos por referencia, lo cual es divertido... :D

Ademas, cuando van a poder hacer una expresion como:

const char* const miVariable;

sin usar apuntadores??? Ahhh verda??? xD


Stroustrup Approves! :D

Deberan disculpar la falta total de acentos y de la letra Alt+164, pero no he podido acomodar la tonta distrubucion del teclado en mi Arch Linux, que mas mejor dicho soy yo el tonto por no hacerlo, pero bueno, cuando tengas duda, culpa a la computadora o al proceso... :D  Estamos trabajando en ello, espero que para cuando se haga publica esta direccion los post nuevos ya tengan acentos.

Ademas, Stroustrup aprueba este post. :D



Espero que hayan pasado Felices Fiestas!!! Gracias en especial a Diana, Leninostropovich y a Nikolas (pls) por acordarse de mi!!! nwn

Log finished.

Si quieren leer mas de Stroustrup, visiten su pagina de Texas A&M!

3 comments :

  1. Muy interesante y muy elaborado el blog, espero que no lo hallas abandonado (por la fecha de la entrada).

    ReplyDelete
    Replies
    1. Antes de comentar me imagine que los comentarios aparecerían entre /* */
      ;)

      Delete
    2. Abandonadísimo por cuestiones laborales/escolares y deportivas... Pero pienso regresar ahora que estoy en vacaciones y que ya me liberé del futbol americano...

      Gracias por el comment y por la sugerencia! Iré de a poco reviviendo este show... :D

      Delete

Hazmela de tos aqui abajito!!! :D