2

Punteros

Al ver que mucho de mis compañeros tuvieron problemas al saber que son y como se utilizan los punteros, me decide a crear este articulo en donde lo explico a detalle.
¿QUE SON LOS PUNTEROS?
Los punteros son una poderosa herramienta que ofrece el lenguaje C y se dice que también es muy temida porque causa muchos errores que son difíciles de identificar e incluso de depurar. Sin embargo una vez que estos son entendidos, se pueden utilizar para diversas tareas muy útiles.
Un puntero es una variable que contiene una dirección de memoria normalmente de otra variable ya establecida, por esa razón se dice que los punteros apuntan a una variable.
La sintaxis y declaración de un puntero es la siguiente:
tipo *nombre
El tipo de base en la declaración sirve para saber el tipo de variable a la cual apunta la variable puntero, esto es importante para saber cuanto espacio va a ocupar la variable puntero y para poder realizar ciertas operaciones aritméticas con los mismos. El nombre simplemente es el nombre que se le asigna a la variable puntero.
Algunos ejemplos de punteros son los siguientes:
int *a;
char *b;
float *c;
Además de esto, los punteros cuentan con dos operadores especiales; * y &.
El operador & se encarga de devolver la dirección de una variable de memoria. Se declara de la siguiente manera:
int *a, b;
Y después hacemos lo siguiente:
a = &b;
De esta forma estamos diciendo que el puntero a va a apuntar a la variable b
El operador * devuelve el valor de la variable a la que esta apuntando el puntero. Veámoslo con un ejemplo:
int *a, b, c;
Si hacemos:
b = 15;
a = &b;
c = *a;
Lo que acaba de suceder aquí es que primero decimos que el entero b vale 15, el puntero a apunta a la dirección de la variable b y c es igual al valor de la dirección a la que apunta a. Lo que significa que c = 15
Con las variables de tipo puntero es posible realizar algunas operaciones:

  • Asignación de punteros. Es posible asignar el valor de una variable puntero a otra variable de tipo puntero. Por ejemplo:
    int *a, *b, c;
    Donde:
    a = &c;
    b = a;
    En este caso el puntero a contiene la dirección de memoria de la variable c pero al ser b un puntero igual a a, b también contiene la dirección de memoria de la variable c. Por lo tanto, podría decirse que los punteros a y b apuntan a la misma dirección.

  • Aritmética de punteros. Dentro de las variables punteros es posible utilizar los operadores +, -, ++ y --. Estos operadores lo que hacen es que aumentan o disminuyen la posición de memoria a la que apunta la variable puntero.
    El incremento o decremente se realiza de acuerdo al tipo de variable al que apunten los punteros, de ahí la importancia del tipo que se declara de la variable puntero. Veámoslo con la siguiente tabla:
    Captura.JPG
    Por lo tanto, si tenemos:
    tipo *a:
    Y hacemos:
    a = a + num;
    La posición en la que incrementa a aumenta en num * sizeof(tipo). Los operadores ++ y – equivalen a sumar 1 o restar 1 respectivamente.

  • Comparación de punteros. Sobre las variables de tipo puntero es posible realizar comparaciones entre ellas. Veamos un ejemplo.
    int *a, *b;
    if(a > b){
    printf(“El puntero a apunta a una dirección de memoria mayor que b \n”);
    }
    Existe una fuerte relacion entre los punteros y arrays. Consideremos el siguiente fragmento de código:
    char str[80], p;
    p = str;
    Aqui lo que pasa es que el puntero p esta apuntando al primer elemento del array str. Es posible acceder al quinto elemento del array str de las siguientes maneras: str[4] y _
    (p + 4)_ (recordando que los índices de los arrays empiezan en 0). Esta relacion puede verse mas claramente al saber que el nombre del arrays sin ningún tipo de índice es un puntero al primer valor del array y además, si se tiene en cuenta que un puntero puede indexarse unidimensionalmente como un array, por lo cual, en el ejemplo anterior podríamos referenciar ese elemento como p[4}.
    Es posible obtener la dirección de cualquier elemento de un array de la siguiente forma:
    int str[80], *p;
    p = &str[5]
    Entonces, la variable puntero p tiene la dirección de memoria del sexto elemento del array str.
    Hasta ahora hemos declarado solo variables puntero aisladas, sin embargo, es posible declarar un array de variables puntero. Veamos un ejemplo:
    int *a[10], var;
    Donde podemos asignarle a un puntero de nuestro array de punteros una dirección de una variable de tipo entero (var).
    a[3] = &var;
    Y para saber el valor de var podemos hacerlo de la siguiente manera:
    *a[3];
    Además de esto, como un puntero al final del día es una variable, es posible que nosotros podamos definir un puntero a otro puntero, como en el siguiente ejemplo:
    int a, *b, **c;
    b = &a;
    c = &b;
    En donde el puntero b apunta a la variable a y a su vez, el puntero c apunta a la dirección del puntero b.
    Podríamos seguir con puntero que apunta a puntero de puntero, pero no tendría mucho sentido hacer esto.
    Bueno amigos, hasta aquí el articulo de hoy, espero que les haya quedado claro y espero sus dudas y comentarios en la barra de comentarios.

Escribe tu comentario
+ 2