BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.2. EL TIPO DE DATO POINTER. (PUNTEROS SIN TIPO)
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.2. EL TIPO DE DATO POINTER. (PUNTEROS SIN TIPO)
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.2. EL TIPO DE DATO POINTER. (PUNTEROS SIN TIPO)

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ El tipo dato pointer.

El tipo de dato pointer, es un tipo de dato que permite almacenar la dirección de una variable o cualquier dirección que se le pueda indicar, para obtener la dirección de memoria de una variable se usa el operador @. Veamos el siguiente programa:


Descargar
{$codepage UTF8}

VAR
  num01:integer; 
  dir:pointer; 
BEGIN
  a:=68;
  dir:=@a;
  Writeln('a=',a);
  Writeln('dirección de memoria=',longword(dir))
END.
Código fuente 1: Ejemplo del uso del operador @.
Descargar

En este programa se declaran dos variables: num01 y dir, la primera es una variable de tipo entero y la segunda variable dir es de tipo pointer. Lo primero que hace el programa es asignar el valor 68 a la variable num01, y después obtiene la dirección de memoria de la variable num01 con el operador @ y lo asigna a la variable dir, y de esa manera la variable dir almacena la dirección de memoria de la variable num01. Para indicar que la variable de tipo pointer no contiene ninguna dirección de memoria, se debe usar la palabra reservada NIL. El programa antes de terminar muestra el contenido de ambas variables, en el caso de la variable dir se hace un solapamiento con el tipo de dato longword, para mostrarlo, ya que la rutina witeln o write no permite mostrar variables de tipo pointer.

Los punteros se usan generalmente para guardar, las direcciones de memoria de las variables dinámicas. El compilador nos ofrece dos rutinas para la creación y eliminación de variables dinámicas, que son: getmem y freemem. Getmem nos permite crear una variable dinámica indicando el tamaño en bytes que se va a usar y freemem elimina la variable dinámica liberando el espacio usado por la variable dinámica. Ejemplo:


Descargar
{$codepage UTF8}
VAR  
  PNumero:pointer;  
BEGIN 
  PNumero:=NIL;  
  
  getmem(PNumero,2);
  integer(PNumero^):=1024;
  Writeln(integer(PNumero^));
  freemem(PNumero); 
  
  getmem(PNumero,4);
  longint(PNumero^):=2048; 
  Writeln(longint(PNumero^));
  freemem(PNumero);
  
  getmem(PNumero,8);
  int64(PNumero^):=4096; 
  Writeln(int64(PNumero^));
  freemem(PNumero)      
    
END.
Código fuente 2: Ejemplo del uso de getmem y freemem.
Descargar

En este ejemplo se introduce el operador ^, que nos permite acceder a la variable dinámica, el programa primero crea una variable dinámica de 2 bytes con la rutina getmem, le asigna 1024 y lo muestra por pantalla, usando las siguientes instrucciones:

getmem(PNumero, 2); integer(PNumero^):=1024; Writeln(integer(PNumero^)); freemem(PNumero)

El primer parámetro de la rutina getmem es la variable puntero PNumero, que contendrá la dirección de memoria de la variable dinámica, el segundo parámetro permite indicar de cuantos bytes será la variable dinámica, en este caso será de dos bytes. A continuación se asigna el valor 1024 a la variable dinámica usando el operador ^, colocado a la derecha de la variable PNumero, pero además se hace un solapamiento con el tipo de dato integer, ya que al crear la variable dinámica, no se le indica cómo se debe interpretar los dos bytes que se reservan en memoria. Para mostrar los datos o valores colocados en la variable dinámica se hace un solapamiento con el tipo de dato integer y también se usa el operador ^, para acceder al valor almacenado en la variable dinámica, si no se usa el operador ^, entonces se mostrará la dirección de memoria que almacena la variable PNumero. Finalmente se elimina la variable dinámica con FreeMem, dejando espacio para el uso de las otras variables dinámicas que se crean a continuación. Las instrucciones que quedan del programa crean 2 variables dinámicas de 4 y 8 bytes usando el mismo puntero PNumero y haciendo un solapamiento con los tipos de datos longint y int64.

El siguiente programa es similar al anterior, pero esta vez se usa el tipo de dato string.


Descargar
{$codepage UTF8}
VAR  
  PCad:pointer;  
BEGIN 
  PCad:=NIL;  
  
  getmem(PCad,5);   //4 bytes para los caracteres, 1 para la longitud
  string(PCad^):='Hola';
  Writeln(string(PCad^));
  freemem(PCad); 
  
  getmem(PCad,11);  //11 bytes para los caracteres, 1 para la longitud
  string(PCad^):='0123456789'; 
  Writeln(string(PCad^));
  freemem(PCad);
         
END.
Código fuente 3: Ejemplo del uso de getmem y freemem con String.
Descargar

Como se puede observar se crean dos variables dinámicas una de 5 bytes y la otra de 11 bytes, en ambos casos las direcciones de memoria de las variables dinámicas se almacenan en la misma variable de tipo pointer PCad, si no usamos freemem antes de crear la segunda variable dinámica de 11 bytes, entonces la primera variable de 5 bytes se quedará en memoria ocupando espacio y no se podrán acceder a los valores que este tenga almacenados, porque la variable puntero PCad, tendrá la dirección de memoria de la segunda variable dinámica de 11 bytes.

Intentar usar freemem con un puntero que apunta a una variable estática, producirá un error de acceso no válido, ya que las variables estáticas se crean en el área de datos y el área de datos es un área protegida para el programa. Debemos tener presente que un puntero puede almacenar o guardar una dirección de memoria de una variable estática o una variable dinámica. Si el puntero apunta a una variable estática entonces freemem intentará liberar espacio en un área protegida produciéndose el error de acceso no válido: Runtime Error 216 General Protection fault. (Fallo de protección general).

El tipo de dato pointer, se conoce como puntero sin tipo, ya que este tipo de dato sólo sirve para almacenar direcciones de memoria sin estar asociado a un tipo de dato en particular. El tipo de dato pointer no se puede usar con las rutinas read, readln, write y writeln.


Última revisión: 10/12/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.