Указатели позволяют вам делать в Паскале некоторые важные вещи, но есть пара моментов, которые при работе с указателями нужно отслеживать. При использовании указателей допускаются следующие общие ошибки:
Разыменование неинициализированных указателей
Одним из общих источников ошибок при работе с указателями является разыменование указателя, который еще не был инициализирован. Как и в случае других переменных Паскаля, значение переменной-указателя не будет определено, пока вы не присвоите ей значение, так что она сможет указывать на какой-то адрес в памяти.
Перед использованием указателей им всегда нужно присваивать значения. Если вы разыменовываете указатель, которому еще не присвоено значение, то считанные из него данные могут представлять собой случайные биты, а присваивание значения указываемому элементу может затереть другие данные, вашу программу или даже операционную систему. Это звучит несколько пугающе, но при определенной дисциплине такие вещи легко отслеживаются.
Использование пустого указателя
Чтобы избежать разыменования указателей, которые не указывают на что-либо значащее, нужен некоторый способ информирования о том, что указатель недопустим. В Паскале предусмотрено зарезервированное слово nil, которое вы можете использовать в качестве содержательного значения указателей, которые в данный момент ни на что не указывают. Указатель nil является допустимым, но ни с чем не связанным. Перед разыменованием указателя вы должны убедиться, что он отличен от nil (не пуст).
Предположим, например, что у вас есть функция, возвращающая указатель на некоторый элемент в памяти. Вы можете указать, что такая функция не может найти элемент, возвращая значение nil.
var ItemPointer: Pointer;
function FindIten: Pointer; begin . . . { найти элемент, возвращая указатель на него или nil, если элемент не найден }
end;
begin ItemPointer := nil; { начнем в предположении nil } ItemPointer := FindItem; { вызвать функцию } if ItemPointer <> nil then ... { для надежности разымено- вания ItemPointer } end.
8 8 8
| |