Punteros

Punteros, punteros, punteros, el tema más difícil de C, pero ya no más.

Vamos a ver en esta lección todo lo relacionado a ellos para que todo sea más fácil para ti en el futuro, así que … Comenzamos

Cada variable tiene un espacio en la memoria RAM. Los punteros son una de las poderosas herramientas que ofrece el lenguaje C a los programadores.

array

Sin embargo, son también una de las más peligrosas, el uso de punteros sin inicializar es una fuente frecuente de errores en los programas de C, y además, suele producir fallos muy difíciles de localizar y depurar.

Podemos distinguir entre 2 tipos:


Parámetro de Indirección

*X

  • Un puntero es una variable que contiene una dirección de memoria
  • Un Puntero regresa el valor de una dirección de una variable.

Por lo cual se suele decir que el puntero “apunta” a la otra variable.

La sintaxis de la declaración de una variable puntero es:

tipo *nombreDelPuntero;

Donde tipo puede ser int, float,char, ect…


Parámetro de Dirección

&x

Un parámetro de dirección regresa la dirección de la variable a la que apuntamos.

Cuando usamos el símbolo estamos asignando o refiriendo a una dirección, es decir cuando escribimos &X estamos diciendo la dirección de X.

Es decir el operador & devuelve la dirección de una variable de memoria.

Crear un Puntero

int *puntero;

Asignar a un puntero una dirección de memoria

nombrePuntero = &variableParaApuntar;

Que un puntero regrese el valor al que apunta

variable = *nombrePuntero;


Ejemplos:

int *a
int b,c;

//Si hacemos:
b=15;
a=&b;
c=*a;

Entonces c contendrá el valor 15
Pues *a devuelve el valor de la dirección que sigue (a la que “apunta” la variable puntero), y con anterioridad hemos hecho que a contenga la dirección de memoria de la variable b usando para ello el operador &.

int *a
int b;

//Y hacemos:
a = &b;

La variable puntero a contendrá la dirección de memoria de la variable b.


Operaciones con Punteros

Asignación de Punteros

Es posible asignar el valor de una variable de tipo puntero a otra variable de tipo puntero.Por ejemplo:

int *a,*b
int c;
a=&c;
b=a;

Entonces b contiene el valor de a, y por ello, b también “apunta” a la variable c.


Aritmética de Punteros

Sobre las variables de tipo puntero es posible utilizar los operadores +, -, ++ y —

Estos operadores incrementan o decrementan la posición de memoria a la que “apunta” la variable puntero. El incremento o decremento se realiza de acuerdo al tipo base de la variable de tipo puntero, de ahí la importancia del tipo del que se declara la variable puntero.


Comparaciones de Punteros

Sobre las variables de tipo puntero es posible realizar operaciones de comparación entre ellas. Veamos un ejemplo:

int *a,*b;
if (a<b) printf(“a apunta a una dirección más baja que b”);

Arrays  como Punteros

Otra manera de acceder a una parte contigua de la memoria, en lugar de con un arreglo, es con un puntero.

Ya que estamos hablando acerca de las cadenas, las cuales se componen de caracteres, estaremos usando punteros a caracteres, o más bien:

char *string;

Después hacemos que apunte a la dirección de memoria del array

string = &(array[0]);

Ahora estas sentencias son iguales:

  • array[7];
  • *(string+7);

Existe una estrecha relación entre los punteros y los arrays. Consideremos el siguiente fragmento de código:

char str[80],*p;

p=str;

int str[80],*p;

p=&str[4];

Este fragmento de código pone en la variable puntero p la dirección del primer elemento del array str. Entonces, es posible acceder al valor de la quinta posición del array mediante str[4] y *(p+4) (recuérdese que los índices de los arrays empiezan en 0).

Esta estrecha relación entre los arrays y los punteros queda más evidente si se tiene en cuenta que el nombre del array sin índice es la dirección de comienzo del array, y, si además, se tiene en cuenta que un puntero puede indexarse como un array unidimensional, por lo cual, en el ejemplo anterior, podríamos referenciar ese elemento como p[4].

Notación

Vector[x]; *(Vector + x);
Vector[x][y]; *(*(Vector+x) + y);
Vector[x][y][z]; *(*(*(Vector+x) + y) + z);

Sin embargo, los punteros sólo tienen una dirección, no pueden contener todos los caracteres de una matriz de caracteres. Esto significa que cuando usamos un char * para realizar un seguimiento de una cadena, debe existir el arreglo de caracteres que contiene la cadena.

btn1 btn
btn

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s