Almacenamiento Real
Es importante tener en cuenta que el almacenamiento puede realizare en dispositivos de almacenamiento volátil (RAM, Caché) o dispositivos de almacenamiento no volátil (discos duros, Memorias extraibles, etc.), se considera como primario el almacenamiento realizado en dispositivos volátiles y secundario en dispositivos no volátiles.
Para efectos de desarrollo del tema, durante este entrada haremos referencia a ambos como un todo en el cual, por abstracción, se incluye el proceso y el dispositivo, por lo que en ocasiones se utilizaran como sinónimo.
int x;
Ahora bien en el caso de los punteros tenemos que sin lugar de dudas, son una de las razones fundamentales para que el lenguaje C sea tan potente y tan utilizado, dentro de sus características tenemos:
Un puntero nulo no apunta,valga la redundancia, a ninguna parte (dato válido) en particular, es decir, éstos se utilizan para proporcionar a un programa un medio de conocer cuando una variable puntero no direcciona a ninguna direccion de memoria, Ejemplo en C++:
#include <stdio.h>
char *punteroChar = NULL;
Hemos declarado un puntero "p", el cual podrá almacenar la dirección de memoria de un tipo de dato char, pero que en el instante de su declaración no apunta a ningún valor en especifico.
Puntero Void.
Este apunta a cualquier tipo de dato, estos pueden en realidad apuntar al universo de tipos de datos primitivos o definidos por el usuario, podemos declararlo en c++ asi:
#include <stdio.h>
void *puntero;
Nota.
No debemos confundir los punteros void y NULL. Un puntero nulo no direcciona a ningún dato válido. Un puntero void direcciona datos de un tipo no especificado. Un puntero void se puede igualar a nulo si no se direcciona ningún dato válido. Nulo es un valor; void es un tipo de dato, ejemplo en C++.
#include <stdio.h>
void *puntero = NULL;
El punto declarado anteriormente no apunta a ningún dato y a ningún tipo.
Punteros en Java y C++
En el caso del lenguaje C y C++, los punteros pueden implementarse a través de una sintaxis simple, pero en el caso de Java encontraremos en la red muchos aportes en los que se dice que los punteros no existen o no se pueden implementar en Java, para aclarar esa situación pondré en perspectiva la naturaleza de ambos lenguajes.
C++ es un lenguaje nacido a partir de la integración de características de orientación a objetos implementados en Simula 67, y del lenguaje C, el cual es un lenguaje perteneciente al paradigma imperativo, lo que hace que la declaración y uso de los punteros deba realizarse de manera explicita a través de declaraciones.
En el caso de Java, derivado directo de C++, el uso de direcciones de memoria se realiza de manera implícita en cualquier tipo de dato no primitivo, los datos primitivos son int, float, double, String, etc., esto es abstracción pura en los lenguajes orientados a objetos, el hecho que no podamos identificar los punteros como en el caso de C++ no significa en ningún momento que estos no se utilicen.
Referencias
Bibliográficas.
Según Dietel La organización y administración de la “memoria principal”, “memoria primaria” o “memoria real” de un sistema ha sido y es uno de los factores más importantes en el diseño de los S.O., y me atrevo a decir que no solo de los S.O. sino de todo software existente, ya que mientras se aumenta la capacidad de almacenamiento real, se brindan posibilidades de creación de software mas robusto como por ejemplo las suites de Adobe, si comparamos el consumo de memoria de CS3 y CS6, encontraremos una diferencia notable en cuanto a funcionalidad del software y consumo de RAM.
Debemos tener claro que memoria y almacenamiento son términos diferentes, si revisamos su significado según la RAE tenemos:
Memoria: Dispositivo físico, generalmente electrónico, en el que se almacenan datos e instrucciones para recuperarlos y utilizarlos posteriormente.
Almacenamiento: Acción y efecto de almacenar.
Almacenar: Registrar información en la memoria de un ordenador.
Entonces la memoria es el dispositivo físico y el almacenamiento es el proceso que se lleva a cabo para ingresar ciertos datos dentro de una memoria.
Es importante tener en cuenta que el almacenamiento puede realizare en dispositivos de almacenamiento volátil (RAM, Caché) o dispositivos de almacenamiento no volátil (discos duros, Memorias extraibles, etc.), se considera como primario el almacenamiento realizado en dispositivos volátiles y secundario en dispositivos no volátiles.
Recordemos que según el modelo de maquina de Von Neumann, implementado en el hardware de computador actual, los datos y programas deben encontrarse en el almacenamiento principal o primario para ejecutarse y poder hacer referencia directa a éstos, y la estructura de la memoria debe poseer la capacidad de reutilización de la maquina de Alan Turing.
El almacenamiento es de hecho un proceso mas complejo dentro del cual encontramos conceptos como direcciones virtuales de memoria, paginación, dirección física, etc. pero de manera simple podemos representarlo de la siguiente manera:
Representación de Estructuras de Datos por Posiciones
Es llamada también Almacenamiento Contiguo, en ésta el lugar físico donde se almacena un elemento determina automáticamente su posición relativa en la estructura de datos, los arreglos y los registros (records en C++) son ejemplos de estructuras de datos almacenados en bloques contiguos, podemos ver una representación aproximada a continuación:
Ventajas.
- Fácil implementación.
- Rapidez de recorrido, debido a que la dirección de cada elemento está implícita en su posición física.
Desventajas.
Al realizar manipulaciones de los elementos
- Al agregar un nuevo elemento en algún lugar que no sea el último, se tiene que desplazar los elementos hacia abajo que están después de la posición de inserción deseada logrando que se genere un espacio para poder agregar un nuevo elemento.
- Al borrar un elemento que no sea el último deja un espacio no permitido entre los elementos, para lo cual se tiene que desplazar una posición hacia arriba los elementos,que están después del elemento borrado.
Es llamada también Almacenamiento Disperso, en este tipo de representación la ubicación física de un elemento no determina la posición relativa que tiene dentro de la Estructura de Datos, por lo cual dos elementos contiguos en la Estructura de Datos no necesariamente deben estar almacenados físicamente en posiciones contiguas dentro del espacio de almacenamiento, para ello es necesario que cada elemento almacene la dirección física del siguiente elemento, lo que significa que cada elemento debe contener 2 o más campos.
A manera de mostrar un aproximado de la estructura en memoria tenemos:
Recordemos que las direcciones de memoria utilizan el formato 0xffffffff y no el mostrado en el esquema.
Ventajas.
- La representación no es exclusiva debido a que mantiene una organización lineal.
- Posibilidad de agregar y eliminar elementos de la estructura, sin tener que desplazar los elementos que ya estaban en ella.
- Permite un uso más eficiente del espacio de almacenamiento ya que puede crecer o decrecer en tiempo de ejecución, según requiera el usuario.
Desventajas.
- Cada elemento deber “recordar” donde está alguno de los elementos, cada espacio es un elemento compuesto por (dato y la dirección del siguiente elemento).
- Las operaciones requieren mayor tiempo de procesamiento, debido a que el acceso no es directo, se requiere realizar un recorrido hasta encontrar el elemento deseado.
Punteros
Antes de entrar en la estructura de un puntero, recordemos lo que acontece cuando se declara una variable, sin importar el tipo, a ésta se asocian tres atributos fundamentales: su nombre, su tipo y su dirección en memoria, por ejemplo:int x;
Ahora bien en el caso de los punteros tenemos que sin lugar de dudas, son una de las razones fundamentales para que el lenguaje C sea tan potente y tan utilizado, dentro de sus características tenemos:
- Un puntero es una variable como cualquier otra.
- Una variable puntero (o puntero) es una variable que contiene direcciones de otras variables.
- Un puntero es una variable que contiene una dirección de memoria, utilizando punteros su programa puede realizar muchas tareas que no sería posible utilizando tipos de datos estándar.
- Cuando se referencia (se hace uso) al valor de la variable, el compilador de C accede automáticamente a la dirección de memoria donde se almacena un dato.
- A través de estos puede lograrse la eficiencia en el acceso a una dirección de memoria utilizando un puntero.
Un puntero nulo no apunta,valga la redundancia, a ninguna parte (dato válido) en particular, es decir, éstos se utilizan para proporcionar a un programa un medio de conocer cuando una variable puntero no direcciona a ninguna direccion de memoria, Ejemplo en C++:
#include <stdio.h>
char *punteroChar = NULL;
Hemos declarado un puntero "p", el cual podrá almacenar la dirección de memoria de un tipo de dato char, pero que en el instante de su declaración no apunta a ningún valor en especifico.
Puntero Void.
Este apunta a cualquier tipo de dato, estos pueden en realidad apuntar al universo de tipos de datos primitivos o definidos por el usuario, podemos declararlo en c++ asi:
#include <stdio.h>
void *puntero;
Nota.
No debemos confundir los punteros void y NULL. Un puntero nulo no direcciona a ningún dato válido. Un puntero void direcciona datos de un tipo no especificado. Un puntero void se puede igualar a nulo si no se direcciona ningún dato válido. Nulo es un valor; void es un tipo de dato, ejemplo en C++.
#include <stdio.h>
void *puntero = NULL;
El punto declarado anteriormente no apunta a ningún dato y a ningún tipo.
Punteros en Java y C++
En el caso del lenguaje C y C++, los punteros pueden implementarse a través de una sintaxis simple, pero en el caso de Java encontraremos en la red muchos aportes en los que se dice que los punteros no existen o no se pueden implementar en Java, para aclarar esa situación pondré en perspectiva la naturaleza de ambos lenguajes.
C++ es un lenguaje nacido a partir de la integración de características de orientación a objetos implementados en Simula 67, y del lenguaje C, el cual es un lenguaje perteneciente al paradigma imperativo, lo que hace que la declaración y uso de los punteros deba realizarse de manera explicita a través de declaraciones.
En el caso de Java, derivado directo de C++, el uso de direcciones de memoria se realiza de manera implícita en cualquier tipo de dato no primitivo, los datos primitivos son int, float, double, String, etc., esto es abstracción pura en los lenguajes orientados a objetos, el hecho que no podamos identificar los punteros como en el caso de C++ no significa en ningún momento que estos no se utilicen.
Referencias
Bibliográficas.
- Aguilar, Luis J. (2004).Algoritmos y estructuras de datos, una perspectiva en C. McGraw-Hill.
- Aguilar, Luis J. (2001).Programación en C, Metodología, algoritmos y estructura de datos. McGraw-Hill.
- H. M. Deitel.(1987). Introducción a los Sistemas Operativos. Addison-Wesley Iberoamericana, México.
- Sebesta, Robert W. (2010) Concepts of Programming Languages. (9ª Edición). PEARSON.
Electrónicas.
- Administración de Memoria, consultado el 6 de octubre de 2010, disponible en http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/SO3.htm
- Erreyes, Daysi M. Introducción a las estructuras de datos, consultado el 31 de enero de 2011, disponible en: http://eqaula.org/eva/file.php/1004/CAPITULO_I.pdf
Comentarios
Publicar un comentario