PUNTEROS
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 indirección (*) devuelve un alias para el objeto al cual apunta el operando del puntero.
Aritmética de Punteros
EJEMPLO: #include
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
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...
Los punteros son variables que almacenan direcciones de memoria de otra variable.
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.
Un puntero se definen de la siguiente manera:
* ;
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″.