Pointers in Pascal
program Pointers;
uses
SysUtils;
procedure ZeroVal(var iVal: Integer);
begin
iVal := 0;
end;
procedure ZeroPtr(iPtr: ^Integer);
begin
iPtr^ := 0;
end;
var
i: Integer;
iPtr: ^Integer;
begin
i := 1;
WriteLn('initial: ', i);
ZeroVal(i);
WriteLn('zeroval: ', i);
iPtr := @i;
ZeroPtr(iPtr);
WriteLn('zeroptr: ', i);
WriteLn('pointer: ', IntToHex(NativeUInt(iPtr), 8));
end.Pascal supports pointers, allowing you to pass references to values and records within your program.
We’ll show how pointers work in contrast to values with two procedures: ZeroVal and ZeroPtr. ZeroVal has a var parameter, which is passed by reference in Pascal. ZeroVal will directly modify the i variable in the calling procedure.
ZeroPtr takes an ^Integer parameter, which is a pointer to an Integer. The iPtr^ syntax in the procedure body then dereferences the pointer, allowing us to modify the value it points to. Assigning a value to a dereferenced pointer changes the value at the referenced address.
In the main program:
- We initialize
iwith the value 1 and print it. - We call
ZeroVal(i), which modifiesidirectly. - We create a pointer
iPtrthat points toiusing the@operator. - We call
ZeroPtr(iPtr), which modifies the valueithrough the pointer. - Finally, we print the memory address of
iusing theIntToHexfunction to convert the pointer to a hexadecimal string.
To run this program, save it as pointers.pas and compile it using a Pascal compiler like Free Pascal:
$ fpc pointers.pas
$ ./pointers
initial: 1
zeroval: 0
zeroptr: 0
pointer: 00AF7C30Note that ZeroVal changes the i in the main program because it’s passed by reference. ZeroPtr also changes i because it has a pointer to the memory address of that variable.
Pascal’s pointer syntax is different from some other languages:
^is used to declare a pointer type@is used to get the address of a variable^is also used to dereference a pointer
This example demonstrates basic pointer usage in Pascal, showing how they can be used to modify values indirectly.