Pascal - Punteros

Los punteros en Pascal son fáciles y divertidos de aprender. Algunas tareas de programación de Pascal se realizan más fácilmente con punteros, y otras tareas, como la asignación de memoria dinámica, no se pueden realizar sin usar punteros. Por lo tanto, es necesario aprender los consejos para convertirse en un programador Pascal perfecto. Comencemos a aprenderlos en pasos simples y sencillos.

Como sabe, cada variable es una ubicación de memoria y cada ubicación de memoria tiene su dirección definida a la que se puede acceder usando el nombre de la variable de puntero, que denota una dirección en la memoria.

¿Qué son los punteros?

Un puntero es una variable dinámica, cuyo valor es la dirección de otra variable, es decir, la dirección directa de la ubicación de la memoria. Como cualquier variable o constante, debe declarar un puntero antes de poder usarlo para almacenar cualquier dirección de variable. La forma general de una declaración de variable de puntero es:

type
   ptr-identifier = ^base-variable-type;

El tipo de puntero se define anteponiendo la flecha hacia arriba del símbolo de intercalación (^) con el tipo base. El tipo base define los tipos de elementos de datos. Una vez que se define que una variable de puntero es de cierto tipo, solo puede señalar elementos de datos de ese tipo. Una vez que se ha definido un tipo de puntero, podemos usar elvar declaración para declarar variables de puntero.

var
   p1, p2, ... : ptr-identifier;

A continuación se muestran algunas declaraciones de puntero válidas:

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

Las variables de puntero se desreferencian utilizando el mismo símbolo de intercalación (^). Por ejemplo, la variable asociada referida por un puntero rptr , es rptr ^ . Se puede acceder como:

rptr^ := 234.56;

El siguiente ejemplo ilustrará este concepto:

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

Imprimir una dirección de memoria en Pascal

En Pascal, podemos asignar la dirección de una variable a una variable de puntero usando el operador de dirección (@). Usamos este puntero para manipular y acceder al elemento de datos. Sin embargo, si por alguna razón, necesitamos trabajar con la dirección de memoria en sí, necesitamos almacenarla en una variable de tipo palabra.

Extendamos el ejemplo anterior para imprimir la dirección de memoria almacenada en el puntero iptr -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

Punteros NIL

Siempre es una buena práctica asignar un NILvalor a una variable de puntero en caso de que no tenga una dirección exacta para asignar. Esto se hace en el momento de la declaración de la variable. Un puntero que se asignaNILapunta a ninguna parte. Considere el siguiente programa:

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

The value of ptr is 0

Para comprobar si hay nil puntero, puede usar una declaración if de la siguiente manera:

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Punteros Pascal en detalle

Los punteros tienen muchos conceptos, pero fáciles, y son muy importantes para la programación de Pascal. A continuación se presentan algunos conceptos importantes de punteros, que deberían ser claros para un programador de Pascal:

No Señor Concepto y descripción
1 Pascal - Aritmética de punteros

Hay cuatro operadores aritméticos que se pueden usar en punteros: incremento, decremento, +, -

2 Pascal - Matriz de punteros

Puede definir matrices para contener varios punteros.

3 Pascal: puntero a puntero

Pascal le permite tener un puntero en un puntero y así sucesivamente.

4 Pasando punteros a subprogramas en Pascal

Pasar un argumento por referencia o por dirección permite que el subprograma llamado cambie el argumento pasado en el subprograma que llama.

5 Puntero de retorno de subprogramas en Pascal

Pascal permite que un subprograma devuelva un puntero.