domingo, 24 de enero de 2016

PUNTEROS

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, 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 diferenciar bloques de memoria asignados dinámica mente y para proveer el paso de argumentos por referencias en las llamadas a funciones.

DECLARACIÓN

Se declara igual que cualquier otra variable, pero anteponiendo un * (asterisco) antes del nombre de la variable.

Su sintaxis seria:

Tipo *Nombre Puntero;
Donde tipo es el tipo de dato al que diferenciará este puntero.

#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. \n El valor de *puntero es: %d. \n",a,*puntero);
printf ("La direccion de memoria de *puntero es: %p", puntero);
return 0;
}

LOS OPERADORES

Existen dos operadores especiales de punteros: * y &. 

• El operador & (operador dirección), aplicado sobre el nombre de una variable, devuelve su dirección de memoria.

 • El operador * (operador in dirección) aplicado sobre una variable de tipo puntero permite acceder al dato al que apunta, es decir, al valor de la variable situada en esa dirección de memoria. 

 ASIGNACIÓN DE PUNTEROS

Respecto a la comparación y a la asignación, los punteros se ajustan a las mismas reglas que cualquier otra variable en C: • Un puntero puede utilizarse a la derecha de una declaración de asignación para asignar su valor a otro puntero. • Podemos comparar dos punteros en una expresión relacional. 


INICIALIZACION DE PUNTEROS

Al igual que otras variables, C no inicializa los punteros cuando se declaran y es preciso inicializarlos antes de su uso. TODO PUNTERO DEBE INICIALIZARSE, ya que en caso contrario tras ser declarado apuntaría a cualquier sitio (PELIGROSO) Æ al usarlo puede p.ej. modificar una parte de la memoria reservada a otra variable Si aún no sabemos dónde debe apuntar, se le asignará el valor NULL (nulo) Î No apunta a ningún sitio en especial. Ejemplo: int *p = NULL; 

Punteros y vectores

Los vectores son punteros constantes. Un vector sin subindice es un puntero al primer elemento del vector. Una matriz es un vector de vectores. (Ej: int M[3][3];) de manera que en cada elemento del primer vector "se cuelga" otro vector, pudiendo hacer así referencia a filas y columnas.
int X[15];
int *ptrX;
ptrX = X; // ptrX recibe la dirección del primer elemento ( 0 ) de X
Así como también podría escribirse
int X[15];
int *ptrX;
ptrX = &X[0]; // ptrX es igual a la dirección del primer elemento de X
Se pueden utilizar distintos elementos del vector teniendo en cuenta la sintaxis de punteros.
int X[15], Y, *ptrX;
ptrX = X;

Y = *( ptrX + 7 );
En este caso puede verse que Y toma el valor del elemento 7 del vector X, siendo 7 el desplazamiento dentro del vector. El operador de indirección queda fuera del paréntesis porque tiene una prioridad superior a la del operador +. De no existir los paréntesis, se sumaria 7 al elemento X[0]. Teniendo en cuenta que los vectoresson punteros constantes, el nombre del vector puede tratarse como un puntero:
Y = *( X + 7 );

Matrices de punteros

Para realizar una estructura de datos dinámica, se puede utilizar una matriz donde sus elementos sean punteros. Suponiendo que queramos hacer un calendario y lo dividamos por semanas. Podríamos utilizar una matriz con los días de la semana.
const char *dias[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" }
Cada día de la semana, no es un elemento de la matriz, sino que la expresión dias[7] crea una matriz de siete elementos como punteros a char.

No hay comentarios:

Publicar un comentario