Uncategorized

Programando en C: Punteros

Capítulo 18: Punteros en C

Los punteros constituyen una de las herramientas diferenciales del lenguaje de programación C con respecto a otros lenguajes considerados de más alto nivel, desde el punto de vista de la cercanía al lenguaje del ser humano o de la máquina

 dado que el lenguaje de programación C Tiene una consideración, con respecto a esos otros lenguajes, de estar relativamente cerca del lenguaje de la máquina, lógicamente tiene la capacidad de trabajar con punteros o apuntadores, que no es más que la capacidad de poder referirse directamente a un registro en memoria ocupado por una variable, en lugar de llamar directamente a esa variable o a ese referencia 

Obtener la referencia de la posicion en memoria de una variable

En este ejemplo, empezamos declarando una variable de tipo entero a la cual asignamos un valor concreto, que para este ejemplo es el número 5

 a continuación, tal y como hemos hecho otras tantas veces, simplemente devolvemos el valor de esa variable por pantalla, haciendo referencia al propio nombre de la variable directamente en una instrucción de impresión

 la novedad, en este ejercicio, es que, a continuación, devolvemos no ya el valor de la variable, que para esta aplicación no nos interesa tanto, sino la celda de memoria que ocupa en su asignación. es decir, la dirección de la memoria a la que le ha tocado almacenar el valor de esa variable

 dentro de una misma ejecución de un programa, el valor de la posición en la memoria será siempre el mismo.

 sin embargo, si cerramos y abrimos el programa de nuevo, podremos comprobar como naturalmente la posición de la memoria de la variable habrá cambiado, ya que cada vez que se ejecuta el programa, el sistema lo considera como un programa completamente nuevo, y no tiene porqué mantener las posiciones de la memoria con respecto a la ejecución anterior

 además, podremos comprobar fácilmente como la nomenclatura de las direcciones de la memoria podrá variar grandemente de un sistema a otro 

main.c
#include <stdio.h>
int main() {    int numero = 5;    printf(«El numero es: %d \n»,numero);    printf(«La celda de memoria del numero es: %p \n»,&numero);    }

Creación de un puntero

A continuación, una vez que ha quedado claro el concepto anterior, en cuanto a que podemos usar el símbolo ampersand para saber la dirección en memoria de una variable concreta, vamos a declarar un puntero o apuntador

 cómo podemos imaginarnos, el siguiente código es una evolución del código anterior, donde hemos declarado un nuevo puntero, que además, por claridad, recibe exactamente ese mismo nombre. 

Cuando creamos un puntero, habremos observado que la forma de la declaración es exactamente igual que la forma en la que hemos declarado cualquier tipo anterior de variable, pero introducimos un asterisco justo antes del nombre de la variable. esto indica que esa variable no es una variable real, sino que va a apuntar a la dirección de memoria de otra variable

 además, también es importante indicar que el tipo de dato del puntero deberá ser el mismo tipo que el dato al que apunta

 por último, dentro de este ejemplo, vamos a extraer un par de datos del puntero, para saber cómo debemos trabajar y como debemos invocarlos.

 si llamamos al propio puntero, es decir, lo llevamos como si estuviéramos llamando a la propia variable, no tendremos el valor, sino que obtendremos la dirección en la memoria, porque precisamente eso es lo que hace un puntero, básicamente apuntar a la dirección de memoria de otra variable algo así como un acceso directo

 sin embargo, si invocamos al puntero pero lo llamamos con el asterisco antes del nombre de la variable, ahí es cuando estamos llamando al valor de la variable, o lo que es lo mismo, al valor de la variable a la que apunta el puntero 

main.c
#include <stdio.h>
int main() {    int numero = 5;    printf(«El numero es: %d \n»,numero);    printf(«La celda de memoria del numero es: %p \n»,&numero);        int *puntero; // Declaro un puntero    puntero = &numero; // El puntero apunta a la direccion de la memoria de la variable        printf(«El puntero esta en la posicion: %p \n»,puntero);    printf(«El puntero tiene el valor: %i \n»,*puntero);    }

Referencia cambiante al puntero

Todo esto que hemos visto hasta ahora básicamente refuerza el mensaje de que un puntero no es en si una variable, sino que es un acceso directo a la posición es memoria de otra variable existente

 para demostrar la veracidad de esta afirmación, esta extensión del ejercicio, aparentemente trivial, nos demuestra hasta qué punto el puntero va a depender siempre del valor original de la variable referenciada

 de esta forma, en primer lugar, trabajamos con el código con el que hemos estado operando hasta el momento en esta unidad didáctica, pero, como novedad, a continuación, una vez que hemos obtenido el valor del puntero, realizamos un cambio sobre el valor de la variable

 sí la variable fuera una entidad, y el puntero fuera otra entidad, cambiaría el valor de la variable, pero no el valor del puntero

 sin embargo, en el ejemplo a continuación podemos comprobar que, cambiando el valor de la variable, no solo cambia el valor de la variable, sino que también cambia el valor devuelto por el puntero, ya que, una vez más, el puntero finalmente no tiene entidad por si mismo sino que apunta al valor de la variable inicial 

main.c
#include <stdio.h>
int main() {    int numero = 5;    printf(«El numero es: %d \n»,numero);    printf(«La celda de memoria del numero es: %p \n»,&numero);        int *puntero; // Declaro un puntero    puntero = &numero; // El puntero apunta a la direccion de la memoria de la variable        printf(«El puntero esta en la posicion: %p \n»,puntero);    printf(«El puntero tiene el valor: %i \n»,*puntero);        numero = 16;    printf(«El numero es: %d \n»,numero);    printf(«El puntero tiene el valor: %i \n»,*puntero);}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *