PUNTEROS

Los punteros son variables que almacenan direcciones de memoria de otra variable.

Un puntero se definen de la siguiente manera:

<tipo de dato al que apunta> * <nombre del puntero>;

DOS IMPORTANTES REGLAS
Las siguientes reglas son muy importantes a la hora de usar punteros, y deben ser perfectamente aprendidas.

1. Un nombre de variable, precedido por un signo de amperson define la dirección de la variable, y ocasionalmente “la apunta”. Puede leerse la línea 6 del programa como “pt1 es asignado al valor de la dirección de index”.

2. Un puntero con una estrella precediéndole se refiere al valor de la variable apuntada por el puntero. La línea 9 del programa puede leerse como: “al puntero pt1 le es asignado el valor 13″.

Sintaxis
int *ptrID, ID;
ID = 8;

ptrID = &ID; // puntero a ID

AYUDA PARA MEMORIZAR
1. Pensar en & como una dirección.

2. Pensar en * como una estrella que señala un almacenamiento.

Asumimos de momento, que “pt1” y “pt2” son punteros (en breve trataremos la manera para definirlos). Como punteros, no contienen el valor de una variable, pero si contienen su dirección y pueden ser usados para apuntar a una variable.

La línea 6 del programa ejemplo destina el puntero “pt1” a apuntar a la variable que hemos definido como “index”, porque hemos asignado la dirección de “index” a “pt1”. Dado que tenemos un puntero para “index”, podemos manipular su valor llamando a la variable por su nombre o también al puntero.

En la línea 9 modificamos el valor usando el puntero. Como que “pt1” apunta a la variable “index”, colocando una estrella en el puntero, nos referimos a la ubicación en memoria a la que apunta.

La línea 9 también asigna 13 a “index”. En cualquier lugar del programa donde sea permitido usar la variable “index” lo será también usar “*pt1”, dado que su sentido es idéntico mientras el puntero no sea asignado a otra variable.

El manejo de punteros es fundamental para conceptos futuros como la creación y liberación de objetos en tiempo de ejecución de un programa.

operador de dirección (&) devuelve la dirección de memoria de su operando

Punteros y vectores (arrays)

EJEMPLO: int X[15];
int *ptrX;
ptrX = X; // ptrX recibe la dirección del primer elemento ( 0 ) de X

Punteros Constantes

EJEMPLO:
int a=10,b=20;
int * const p = &a; //objeto variable y puntero constante

*p = 15; // Correcto: El valor apuntado es variable.

p=&b; //ERROR: p
es constante.

Matrices de punteros

Ejemplo:
const char *dias[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" }

Punteros a cadenas de caracteres

Ejemplo: char nombre[]="Gustavo A. Chavarria"; //declaramos un array de caracteres
char *puntero=nombre;//Asignamos al puntero el comienzo del array
printf("%s \nIngrese otro nombre: ",puntero);//Escribimos en pantalla nombre...
gets(puntero); //leemos otro nombre
printf("%s",puntero); //escribimos el nuevo nombre...

operador de indirección (*) devuelve un alias para el objeto al cual apunta el operando del puntero.

Aritmética de Punteros

EJEMPLO: #include <iostream>
using std::cout;
using std::endl;

void main()

{

int X[6] = { 1, 2, 3, 4, 5, 6 };

int *prtX;

prtX = X; // incializo el valor del puntero.

cout << endl << *prtX;

prtX += 2;

cout << endl << *prtX;

prtX -= 2;

cout << endl << *prtX;

prtX++;

cout << endl << *prtX;

}

Punteros Genéricos

EJEMPLO:
int *puntero;
funcion (*puntero);

....

void funcion (void *p)



int *q;

q=(int *)p; //En C se podria hacer q = p;

Punteros a Punteros

Ejemplo:
int a=0; //Supongamos que es una variable cuya direccion es 0x1601
int *puntero1=&a; //El puntero tiene guardada la direccion de a,
//pero este tiene como direccion 0x1890
int **puntero2=&puntero1; //**puntero 2 guarda la direccion 0x1890