Указатель - это переменная, которая в качестве своего значение содержит адрес первого байта данных. С помощью указателей можно размещать в динамической памяти любой тип данных. Указатели бывают типизированными и нетипизированными.

Типизированные указатели - указатели, которые связаны с типом данных(integer, real и т.п.). Для объявления типизированных указателей используется символ ^. Например:

...
var p1:^integer;
    p2:^double;
type
    UMyRecord = ^PRecord;
    PRecord = record
      field1,field2:integer;
      field3:UMyRecord;
    end;

Типизированые указатели можно использовать как типы данных, на которые они ссылаются. Для этого после идентификатора переменной надо указывать символ ^. Для любой динамической переменной необходимо выделить память. Её можно выделить с помощью процедуры New. Но при выделение памяти необходимо после работы освобождать память (иначе вся память компьютера может закончиться). Освободить память можно с помощью процедуры dispose. Получить адрес любой переменной можно с помощью функции addr или с помощью символа @. Например:

...
var a:^integer;
    b:integer;
begin
b:=100;
new(a); //Выделяем динамическую память
a^:=b; //Так можно, значение a теперь равно значению b.
dispose(a); //Освобождаем память
a:=@b; //Так тоже можно, но теперь указатель a ссылается на переменную b (т.е., значение a это адрес b)
a:=b; //Так нельзя, a и b - разные типы.
...
end.

В отличие от типизированных указателей, нетипизированные указатели обозначаются типом pointer. Нетипизированные указатели следует использовать если заранее неизвестно с каким типом данных надо работать.

Некоторые функции и процедуры для работы с указателями

править
Функция Описание
function Addr(x):pointer; Возвращает адрес аргумента x. Вместо этой функции можно использовать символ @.
procedure New(var x:pointer); Выделяет память и возвращает ее адрес в аргумент
procedure Dispose(var x:pointer); Освобождает память, которая была зарезервирована за указателем х.
procedure GetMem(var p:pointer; size:integer); Выделяет память для аргумента p с размером size.
procedure FreeMem(vap p:pointer; size:integer); Освобождает память, начиная с адреса p, размером size.
function sizeof(x):integer; Возвращает длину в байтах внутреннего представления указанного объекта х.