jueves, 4 de diciembre de 2014

Punteros


Un puntero es una variable que contiene la dirección de memoria de un dato o de otra variable que contiene al dato. 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.
Muchas de las funciones estandares de C, trabajan con punteros, como es el caso del scanf o strcpy. Estas reciben o devuelve un valor que es un puntero. Por Ej. A scanf se le pasa la dirección de memoria del dato a leer (esto es un puntero)...
char a;
scanf ("%c",&a);

Declarando punteros

Ya se dijo que un puntero es una variable que guarda la dirección de memoria de otra variable, haciendo logica a esto, decimos que un puntero se declara igual que cualquier otra variable, pero anteponiendo un * (asterisco) antes del nombre de la variable.
Su sintaxis seria:
tipo *NombrePuntero;
Donde tipo es el tipo de dato al que referenciará este puntero, es decir, que si se necesita guardar la dirección de memoria de un dato int, se necesita un puntero de tipo int.

Explicación

Veamos el siguiente codigo:
#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;
}

Igual que cuando usamos un &, en la lectura de datos con scanf, igual de esta forma lo usamos aquí, tal vez te acordaras que decíamos que las cadenas de caracteres (%s) no usaban este operador, esto es por que en una cadena de caracteres es un arreglo de caracteres, por lo que el primer carácter es la dirección de inicio de la cadena.
El operador *, nos permite acceder al valor de la direccion del puntero, en este caso nos permite acceder al valor que contiene a la variable a. De esta forma "a" y "*puntero" muestran el mismo dato, pero esto no quiere decir que sea lo mismo, uno es un entero el otro un puntero.
La impresión con %p, es para poder imprimir la dirección de memoria en valor hexadecimal (0x...), también podemos imprimir: ...%p",&a) y funciona de la misma forma, y es lógico que tanto a, como puntero tienen la misma dirección de memoria.
Diferentes direcciones?
Tal vez notaste que en cada ejecución la dirección de memoria cambia, esto es por que es el sistema operativo es quien esta encargado de administrar la memoria y es este quien dice que espacios podra tomar el programa.
Esto quiere decir que uno no puede asignarle una dirección de memoria a un puntero directamente, es decir yo no puedo hacer lo siguiente.
int *puntero=0xbfc5b1c8;
Esto no puedo ni debo hacerlo ya que yo no se que esta haciendo esta dirección de memoria, si el sistema la tiene o no disponible, etc... Pero si puedo hacer esto:
int *puntero=NULL;
NULL, es el espacio en memoria con dirección 0, esto quiere decir que existe, lo que significa que le asignamos una direccion valida al puntero, pero el valor que tiene NULL no se nos permite modificarlo, ya que pertenece al sistema.

Operadores[editar]

Ya anteriormente te poniamos algunos ejemplos de como asignar la dirección de memoria a un puntero y de como acceder al valor de este.
Operador de Dirección (&): Este nos permite acceder a la direccion de memoria de una variable.
Operador de Indireccion (*): Ademas de que nos permite declarar un tipo de dato puntero, también nos permite ver el VALOR que esta en la dirección asignada.
Incrementos (++) y Decrementos (--): Te daras cuenta que puedes usar un puntero como si de un array se tratase, es por esto que permite estos operadores.
De lo anterior podemos decir que:
int a; Es Igual int *puntero=&a; printf("%d",a); Es Igual printf("%d",*puntero);

Operaciones Aritméticas

Un puntero nos permite sumar o restar números enteros, pero su funcionamiento ahora es de posiciones, es decir nos permitirá movernos a la siguiente dirección de memoria.
A un puntero no se le puede realizar multiplicaciones, divisiones, sumas o restas con otro puntero o con un valor de tipo coma flotante (float, double...). Esto es por que un puntero no es un valor es una dirección.
char, con un puntero a int.

No hay comentarios.:

Publicar un comentario