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

(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ÓNComo 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:
tipo *puntero = &variableoriginal
Donde 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:
#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 = №
//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
#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 = №
//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
