Autor Tema: [TUTORIAL] - Punteros & Referencias  (Leído 2267 veces)

Desconectado Farresito

  • PHPero Avanzado
  • ****
  • Mensajes: 385
  • Karma: 5
  • Sexo: Masculino
  • PimPamTomaC++
    • Ver Perfil
    • Farresito
[TUTORIAL] - Punteros & Referencias
« en: 02 de Noviembre de 2010, 20:43:26 pm »
Hola a todos los C(plusplus)eros,

Hoy haré un intento de explicar los famosos y temibles punteros, y las referencias, que hacen algo parecido a éstos primeros. Será un tutorial básico, y cortito, e intentaré hacerlo lo mejor posible. Las referencias serán la segunda parte, puesto que no tengo mucho tiempo :P

(RECOMIENDO HACER COPY PASTE DE LOS EJEMPLOS EN VUESTRO IDE PARA QUE SE COLOREE EL CODIGO Y SE VEA MEJOR. Pondré mas códigos y continuaré el tutorial mañana)

Bien, empecemos con la parte de los punteros:

INTRODUCCIÓN
Como muchos sabrán, en un ordenador, entre muchos de sus componentes, se encuentra la memoria. En ella se almacenan muchos datos, entre ellos, por ejemplo, las variables que nosotros creamos. La memoria, dicho así, está dividida en muchos espacios pequeño, y en cada uno se puede almacenar una variable. Cada espacio tiene una dirección, como si fuera una casa. Cuando tu vas con tus amigos y te preguntan donde vives, tu les dices: vivo en la avenida tal... En la memoria pasa lo mismo. Hay muchos espacios, y para que el ordenador pueda saber donde se encuentra una variable, nosotros le debemos decir la dirección, como en el caso de los amigos. Un puntero almacena la dirección de memoria donde se encuentra un dato, en nuestro caso la variable.

Bien, empecemos practicando, para que no se haga pesado e iremos avanzando y resolviendo dudas a medida que avanza. ¿Como se declara un puntero? De este modo:
Código: [Seleccionar]
tipo *puntero = &variableoriginalDonde tipo, es el tipo de datos de la variable de la que queremos guardar su dirección. Si la variable es un numero entero, usaremos INT.

Donde *puntero, es el nombre del puntero. El puntero actuará como cualquier variable, pero debemos recordar que hay que usar el asterisco (*) antes de nombrarla. En caso contrario, no actuará como puntero.

Donde &variableoriginal el nombre de la variable de la que guardamos su dirección. Hay que usar ampersand (&) antes de su nombre.

Bien, explicado esto, hacemos un ejemplo:
Código: [Seleccionar]
#include <iostream>
#include <stdio.h>
using namespace std;

int main (){
    //Declaramos una variable de tipo entero con valor 3
    int numero = 3;
    /*Declaramos una variable puntero. Como la variable original, la variable numero, es de tipo INT, aquí también
    * debemos usar este tipo. La variable puntero se llamará "puntero" y lleva un * al principio. Contiene la dirección
    * de memoria de la variable "numero", que lleva un & al principio */
    int *puntero = &numero;
    //Mostramos el valor de puntero, para que veamos que contiene una dirección de memoria, de la cual no haremos uso
    cout << puntero << endl;
    //Si hacemos un cout con la variable puntero y un asterisco delante, entonces accedemos al valor de la variable que
    //se encontraba en la dirección que contiene puntero
    cout << *puntero;
}

Veamos otro ejemplo
Código: [Seleccionar]
#include <iostream>
#include <stdio.h>
using namespace std;

int main (){
    //Declaramos una variable de tipo entero con valor 3
    int numero = 3;
    /*Declaramos una variable puntero. Como la variable original, la variable numero, es de tipo INT, aquí también
    * debemos usar este tipo. La variable puntero se llamará "puntero" y lleva un * al principio. Contiene la dirección
    * de memoria de la variable "numero", que lleva un & al principio */
    int *puntero = &numero;
    //Incrementamos numero en 1, puesto que puntero, al contener la dirección de numero, accede a esta variable y
    //incrementa su valor en 1
    *puntero = 0;
    //Observamos como numero baja a 0
    cout << numero;
}

Como pueden ver, los punteros nos permiten acceder a otras variables. Podemos modificar el valor de la variable original modificándolo directamente desde el puntero. Sé que es muy corto el tutorial, pero no me da para más tiempo. Mañana meto un par de ejemplos más e intento explicar las referencias, que es MUY facil si entiendes los punteros.

Nada, cualquier duda postéenla para intentar resolverla. Si alguien encuentra cualquier error, que me lo haga saber, por favor.

Un abrazo. La siguiente parte será las referencias y una continuación de los punteros :)
“Lo mejor de los booleanos es que si te equivocas estás a un sólo bit de la solución correcta.”

-- Anónimo

"No temo a los ordenadores; lo que temo es quedarme sin ellos"

-- Isaac Asimov

Comunidad PHPeros

[TUTORIAL] - Punteros & Referencias
« en: 02 de Noviembre de 2010, 20:43:26 pm »

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[TUTORIAL] - Punteros & Referencias
« Respuesta #1 en: 04 de Noviembre de 2010, 19:27:22 pm »

Perdona mi ignorancia, ¿Pero que es esto?

#Fdo. Physlet

Desconectado Farresito

  • PHPero Avanzado
  • ****
  • Mensajes: 385
  • Karma: 5
  • Sexo: Masculino
  • PimPamTomaC++
    • Ver Perfil
    • Farresito
Re:[TUTORIAL] - Punteros & Referencias
« Respuesta #2 en: 04 de Noviembre de 2010, 23:18:22 pm »
Perdona mi ignorancia, ¿Pero que es esto?
Ah, ahora entiendo el motivo por el que muchos no comentaban... Me imagino estará mal el tutorial, ahora lo borro.

Es como en PHP. Como sabrás, las variables se guardan en unos espacios de la memoria. Supongamos que tenemos la variable SIQUI con VALOR 3. Con los punteros (son otro tipo de variables) puedes acceder al lugar exacto donde se encuentra el valor de una variable, en este caso accederíamos al espacio de la memoria donde se encuentra el valor 3. Por ejemplo:

SUPONGAMOS QUE TENEMOS LA MEMORIA. PARA HACERLO MÁS SENCILLO DIREMOS QUE SE DIVIDE EN 10 PARTES Y EN CADA PARTE CABE EL VALOR DE UNA VARIABLE. UNA DE LAS VARIABLES SE LLAMA SIQUI Y TIENE VALOR 3. ESTA VARIABLE SE ENCUENTRA POR EJEMPLO EN LA POSICIÓN 5 DE LA MEMORIA (RECUERDA QUE TIENE MUCHÍSIMOS ESPACIOS, ES SOLO UN EJEMPLO)

ESPACIO 1: -nada-
ESPACIO 2: -nada-
etc
ESPACIO 5: se encuentra la variable SIQUI con valor 3
ESPACIO 6: se encuentra el puntero que le dice que su valor es el que contiene el espacio de memoria 5
etc

Es decir, si usamos el puntero, este accederá al espacio 5, donde se encuentra el valor de la variable Siqui, y por tanto, actuará como si fuera la variable siqui, puede ver su valor y modificarlo

Un abrazo. Cualquier duda la posteas, por favor.

Es tan difícil entender esto como explicarlo ;)
“Lo mejor de los booleanos es que si te equivocas estás a un sólo bit de la solución correcta.”

-- Anónimo

"No temo a los ordenadores; lo que temo es quedarme sin ellos"

-- Isaac Asimov

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[TUTORIAL] - Punteros & Referencias
« Respuesta #3 en: 05 de Noviembre de 2010, 00:09:00 am »

¿Pero y no sería mas facil modificar directamente el valor de la variable?

#Fdo. Physlet

Desconectado gink

  • PHPer@ Fijo
  • ***
  • Mensajes: 146
  • Karma: 10
  • Sexo: Masculino
    • Ver Perfil
    • Mi blog personal
Re:[TUTORIAL] - Punteros & Referencias
« Respuesta #4 en: 05 de Noviembre de 2010, 01:13:16 am »
¿Pero y no sería mas facil modificar directamente el valor de la variable?
Si usas un puntero (char* nombre) no tienes que especificar la longitud de la variable, y te libras de algunas molestas con los limites.

Aunque algunos compiladores no logran acceder correctamente a la memoria, y algunas veces no puedes trabajar al 100% en todo tu proyecto.

Cualquier cosa dime, ¡saludos!

Desconectado Farresito

  • PHPero Avanzado
  • ****
  • Mensajes: 385
  • Karma: 5
  • Sexo: Masculino
  • PimPamTomaC++
    • Ver Perfil
    • Farresito
Re:[TUTORIAL] - Punteros & Referencias
« Respuesta #5 en: 05 de Noviembre de 2010, 14:24:29 pm »
¿Pero y no sería mas facil modificar directamente el valor de la variable?
El problema es que en algunos casos no conviene cambiar el valor directamente. Los punteros (también) se usan para acceder a espacios de memoria que no se han asignado, es decir, que no hay ninguna variable que guarde su valor allí. Entonces, ¿como podemos acceder a este espacio? Pues la solución es con los punteros. En muchos casos necesitarás acceder a espacios de la memoria aunque no estén asignados, y si estudias assembly, olvídate de no aprender punteros, porque es una necesidad, es indispensable.

Y en el caso de las referencias (las explicaré cuando pueda) también es parecido.

Es muy posible que no entiendas los punteros, Siqui, pero en un tiempo, y cuando domines C++, sí que lo deberás saber, deberás aprenderlo.

Un abrazo

Añado que en C no se puede pasar una variable de referencia a una función, y allí debes usar los punteros. Siqui, lo que si te dejo claro es una cosa: Siempre que puedas usar la variable con normalidad, sin usar punteros, hazlo. Solo usa punteros cuando una cosa no sea posible sin ellos
« Última modificación: 05 de Noviembre de 2010, 14:28:02 pm por Farresito »
“Lo mejor de los booleanos es que si te equivocas estás a un sólo bit de la solución correcta.”

-- Anónimo

"No temo a los ordenadores; lo que temo es quedarme sin ellos"

-- Isaac Asimov