Un puntero es una variable que contiene la dirección de memoria de un dato o de otra variable que contiene al dato en un arreglo. Quiere esto decir, que el puntero apunta al espacio físico donde está el dato o la variable. Un puntero puede apuntar a un objeto de cualquier tipo, como por ejemplo, a una estructura o una función. Los punteros se pueden utilizar para referencia y manipular estructuras de datos, para referenciar bloques de memoria asignados dinamicamente y para proveer el paso de argumentos por referencias en las llamadas a funciones.
Ejemplo breve:
#include <stdio.h> int main() { int a=0; //Declaración de variable entera de tipo entero int *puntero; //Declaración de variable puntero de tipo entero puntero = &a; //Asignación de la dirección memoria de a printf("El valor de a es: %d. \nEl valor de *puntero es: %d. \n",a,*puntero); printf("La direccion de memoria de *puntero es: %p",puntero); return 0; }
Operadores:
Operador de Dirección (&): Este nos permite acceder a la dirección de memoria de una variable.
Operador de Indirección (*): Además de que nos permite declarar un tipo de dato puntero, también nos permite ver el VALOR que está en la dirección asignada.
Incrementos (++) y Decrementos (--)
Punteros Constantes:
Es posible que hayas pensado como declarar un puntero como una constante, tal vez pensaste en un #define, o en un atributo const. Bueno es posible usar el atributo const, pero para un puntero hay que hacerlo de otra forma.
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
Punteros Genéricos:
Un puntero a cualquier tipo de dato puede convertirse a un puntero del tipo void *. Por esto un puntero a void *, recibe el nombre de puntero generico.
En C, se permite la conversión implícita de punteros, pero en C++ esto no es posible, asi que por compatibilidad y buena practica recomendamos usar la conversion explicita (cast).
int *puntero; funcion (*puntero); .... void funcion (void *p) int *q; q=(int *)p; //En C se podria hacer q = p;
Punteros y Matrices:
Anteriormente decíamos que una matriz es una secuencia de espacios en memoria, que nos permitían alojar datos en cada uno y un puntero es una variable que guarda la dirección de memoria, también decíamos como recorre las direcciones de memoria con los operadores ++ y --.
Aquí veremos como puede usarse un puntero como si de una matriz se tratase, luego de que veas que es técnicamente lo mismo, te preguntaras por que usar punteros, pero estos son muy necesarios y únicos que nos permiten realizar cosas que con un array normal, no se puede, como asignarle memoria dinámica, etc...
#include <stdio.h> int main() { int array[10]={0,2,3,5,5,6,7,8,9,0}; //Declarar e inicializar un array. int *puntero = &array[0]; //Le damos la dirección de inicio del array int i; //variable contadora... for (i=0;i<10;i++) printf("%d\n",*(puntero+i)); //imprimimos los valores del puntero. return 0; }
Punteros a cadenas de caracteres:
Ya hemos visto el uso que se le puede dar a un puntero como si de un array se tratase, entonces usando esta misma logica podemos hacer un array de caracteres usando punteros.
char *nombre="Gustavo A. Chavarria";//Es como un array de 20 caracteres
printf("%s",nombre);
Para poder modificar el valor de este puntero, este tendría que apuntar a una dirección que no sea una constante, como un array.
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...
Esta vez pudiste notar que si se pudo remplazar el valor del nombre.
Punteros a Punteros:
Es una variable que contiene la dirección de memoria de un puntero, el cual a su vez contiene la dirección de memoria de un tipo de dato. Recuerden que un puntero sigue siendo un espacio en memoria, pero en vez de almacenar un valor almacena una dirección.
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
No hay comentarios:
Publicar un comentario