Pascal - Aritmética de punteros
Como se explicó en el capítulo principal, el puntero Pascal es una dirección, que es un valor numérico almacenado en una palabra. Por lo tanto, puede realizar operaciones aritméticas con un puntero del mismo modo que con un valor numérico. Hay cuatro operadores aritméticos que se pueden usar en punteros: incremento, decremento, + y -.
Para entender la aritmética de punteros, consideremos que ptr es un puntero entero, que apunta a la dirección 1000. Suponiendo enteros de 32 bits, realicemos la operación de incremento en el puntero -
Inc(ptr);
Ahora, después de la operación anterior, el ptr apuntará a la ubicación 1004 porque cada vez ptrse incrementa, apuntará a la siguiente ubicación entera, que está 4 bytes junto a la ubicación actual. Esta operación moverá el puntero a la siguiente ubicación de memoria sin afectar el valor real en la ubicación de memoria. Siptr apunta a un carácter, cuya dirección es 1000, luego la operación anterior apuntará a la ubicación 1001 porque el próximo carácter estará disponible en 1001.
Incrementar un puntero
Preferimos usar un puntero en nuestro programa en lugar de una matriz porque el puntero variable se puede incrementar, a diferencia del nombre de la matriz, que no se puede incrementar porque es un puntero constante. El siguiente programa incrementa el puntero variable para acceder a cada elemento sucesivo de la matriz:
program exPointers;
const MAX = 3;
var
arr: array [1..MAX] of integer = (10, 100, 200);
i: integer;
iptr: ^integer;
y: ^word;
begin
(* let us have array address in pointer *)
iptr := @arr[1];
for i := 1 to MAX do
begin
y:= addr(iptr);
writeln('Address of arr[', i, '] = ' , y^ );
writeln(' Value of arr[', i, '] = ' , iptr^ );
(* move to the next location *)
inc(iptr);
end;
end.
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Address of arr[1] = 13248
Value of arr[1] = 10
Address of arr[2] = 13250
Value of arr[2] = 100
Address of arr[3] = 13252
Value of arr[3] = 200
Decrementar un puntero
Las mismas consideraciones se aplican a la disminución de un puntero, que disminuye su valor por el número de bytes de su tipo de datos como se muestra a continuación:
program exPointers;
const MAX = 3;
var
arr: array [1..MAX] of integer = (10, 100, 200);
i: integer;
iptr: ^integer;
y: ^word;
begin
(* let us have array address in pointer *)
iptr := @arr[MAX];
for i := MAX downto 1 do
begin
y:= addr(iptr);
writeln('Address of arr[', i, '] = ' , y^ );
writeln(' Value of arr[', i, '] = ' , iptr^ );
(* move to the next location *)
dec(iptr);
end;
end.
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Address of arr[3] = 13252
Value of arr[3] = 200
Address of arr[2] = 13250
Value of arr[2] = 100
Address of arr[1] = 13248
Value of arr[1] = 10
Comparaciones de punteros
Los punteros se pueden comparar utilizando operadores relacionales, como =, <y>. Si p1 y p2 apuntan a variables que están relacionadas entre sí, como elementos de la misma matriz, entonces p1 y p2 se pueden comparar de manera significativa.
El siguiente programa modifica el del ejemplo anterior incrementando el puntero variable siempre que la dirección a la que apunta sea menor o igual que la dirección del último elemento de la matriz, que es @arr [MAX] -
program exPointers;
const MAX = 3;
var
arr: array [1..MAX] of integer = (10, 100, 200);
i: integer;
iptr: ^integer;
y: ^word;
begin
i:=1;
(* let us have array address in pointer *)
iptr := @arr[1];
while (iptr <= @arr[MAX]) do
begin
y:= addr(iptr);
writeln('Address of arr[', i, '] = ' , y^ );
writeln(' Value of arr[', i, '] = ' , iptr^ );
(* move to the next location *)
inc(iptr);
i := i+1;
end;
end.
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Address of arr[1] = 13248
Value of arr[1] = 10
Address of arr[2] = 13250
Value of arr[2] = 100
Address of arr[3] = 13252
Value of arr[3] = 200