Можна оголосити вказівник, не зв’язуючи його з конкретним типом даних. З цією метою використовується стандартний тип даних POINTER
VAR
P1:Pointer;
Оскільки нетипізовані вказівники не зв’язані з конкретним типом даних, їх дуже зручно використовувати для динамічного розміщення даних, структура і тип яких міняються в ході виконання програми.
Операція розіменування
Основною операцією при роботі з вказівниками є розіменування. Суть її полягає в переході від вказівника до значення, на яке він вказує. Синтаксис цієї операції можна зрозуміти з прикладу:
program prob;
uses crt;
var I,j:integer;
ptri:^integer;
begin
i:=5;
ptri:=addr(i);
j:=ptri^;
writeln(‘j=’,j);
repeat until keypressed;
end.
Розіменувані вказівники на структури індексуются (у випадку масивів) чи поділяються на поля (записи, об’єкти) звичайним способом. Наприклад:
Pta^[i] – доступ до і-го елементу масиву
Ptrec^.поле – доступ до поля динамічного запису
ObjPtr^.Метод – доступ до методу динамічного об’єкта.
Присвоєння вказівників
Вказівнику можна присвоювати вміст іншого вказівника такого ж типу або нетипізованого вказівника, константу NIL (порожній вказівник), адресу об’єкта, визначену за допомогою функції addr. Наприклад, якщо ми оголосили такі вказівники:
Var
Pntr1,Pntr2:^Integer;
Pntr3:^Real;
Pntr:Pointer;
i:integer;
то присвоєння
Pntr1:=Nil;
Pntr1:=Pntr2;
Pntr2:=addr(i);
допустимі, а присвоєння
Pntr1:=Pntr3; - ні, оскільки ці змінні вказують на різні типи даних.
Виділення і вивільнення динамічної пам’яті