next up previous contents index
Next: Procedural types Up: Data types Previous: Arrays

Pointers

Free Pascal supports the use of pointers. A variable of the type Pointer contains an address in memory, where the data of another variable may be stored.

Pointers can be typed, which means that they point to a particular kind of data. The type of this data is known at compile time.

Consider the following example:

Program pointers;

type 
  Buffer = String[255];
  BufPtr = ^Buffer;

Var B  : Buffer;
    BP : BufPtr;
    PP : Pointer;

etc..

In this example, BP is a pointer to a Buffer type; while B is a variable of type Buffer. B takes 256 bytes memory, and BP only takes 4 bytes of memory (enough to keep an adress in memory).

Remark: Free Pascal treats pointers much the same way as C does. This means that you can treat a pointer to some type as being an array of this type. The pointer then points to the zeroeth element of this array. Thus the following pointer declaration

Var p : ^Longint;
Can be considered equivalent to the following array declaration:
Var p : array[0..Infinity] of Longint;
The reference P^ is then the same as p[0]. The following program illustrates this maybe more clear:
program PointerArray;

var i : longint;
    p : ^longint;
    pp : array[0..100] of longint;  

begin
  for i:=0 to 100 do pp[i]:=i; { Fill array }
  p:=@pp[0];                   { Let p point to pp }
  for i:=0 to 100 do if p[i]<>pp[i] then writeln ('Ohoh, problem !')
end.

Free Pascal supports pointer arithmetic as C does. This means that, if P is a typed pointer, the instructions

Inc(P);
Dec(P);
Will increase, respecively descrease the address the pointer points to with the size of the type P is a pointer to. For example
Var P : ^Longint;

...

 Inc (p);
will increase P with 4.



Michael Van Canneyt
Thu Sep 10 14:02:43 CEST 1998