Указатели на Паскале легко и весело выучить. Некоторые задачи программирования на Pascal выполняются с помощью указателей, а другие задачи, такие как динамическое распределение памяти, не могут быть выполнены без использования указателей. Поэтому становится необходимым изучать указатели, чтобы стать идеальным программистом на Паскале. Давайте начнем изучать их в простых и легких шагах.
Как вы знаете, каждая переменная является ячейкой памяти, и каждая ячейка памяти имеет свой адрес, к которому можно обратиться, используя имя переменной-указателя, которая обозначает адрес в памяти.
Что такое указатели?
Указатель — это динамическая переменная, значением которой является адрес другой переменной, т. Е. Прямой адрес ячейки памяти. Как и любая переменная или константа, вы должны объявить указатель, прежде чем использовать его для хранения любого адреса переменной. Общая форма объявления переменной указателя —
type ptr-identifier = ^base-variable-type;
Тип указателя определяется путем добавления префикса стрелки каретки (^) к базовому типу. Базовый тип определяет типы элементов данных. Как только переменная-указатель определена для определенного типа, она может указывать только на элементы данных этого типа. После определения типа указателя мы можем использовать объявление var для объявления переменных указателя.
var p1, p2, ... : ptr-identifier;
Ниже приведены некоторые допустимые объявления указателей —
type Rptr = ^real; Cptr = ^char; Bptr = ^ Boolean; Aptr = ^array[1..5] of real; date-ptr = ^ date; Date = record Day: 1..31; Month: 1..12; Year: 1900..3000; End; var a, b : Rptr; d: date-ptr;
Переменные указателя разыменовываются с помощью того же символа каретки (^). Например, связанная переменная, на которую указывает указатель rptr , это rptr ^ . Это может быть доступно как —
rptr^ := 234.56;
Следующий пример проиллюстрирует эту концепцию —
program exPointers; var number: integer; iptr: ^integer; begin number := 100; writeln('Number is: ', number); iptr := @number; writeln('iptr points to a value: ', iptr^); iptr^ := 200; writeln('Number is: ', number); writeln('iptr points to a value: ', iptr^); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Number is: 100 iptr points to a value: 100 Number is: 200 iptr points to a value: 200
Печать адреса памяти в Паскале
В Паскале мы можем присвоить адрес переменной переменной-указателю, используя оператор адреса (@). Мы используем этот указатель для манипулирования и доступа к элементу данных. Однако, если по какой-то причине нам нужно работать с самим адресом памяти, нам нужно сохранить его в переменной типа слова.
Давайте расширим приведенный выше пример для печати адреса памяти, хранящегося в указателе iptr —
program exPointers; var number: integer; iptr: ^integer; y: ^word; begin number := 100; writeln('Number is: ', number); iptr := @number; writeln('iptr points to a value: ', iptr^); iptr^ := 200; writeln('Number is: ', number); writeln('iptr points to a value: ', iptr^); y := addr(iptr); writeln(y^); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Number is: 100 iptr points to a value: 100 Number is: 200 iptr points to a value: 200 45504
Ноль указатели
Рекомендуется всегда присваивать значение NIL переменной-указателю, если у вас нет точного адреса для назначения. Это делается во время объявления переменной. Указатель, которому назначен NIL, указывает на никуда. Рассмотрим следующую программу —
program exPointers; var number: integer; iptr: ^integer; y: ^word; begin iptr := nil; y := addr(iptr); writeln('the vaule of iptr is ', y^); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
The value of ptr is 0
Чтобы проверить нулевой указатель, вы можете использовать оператор if следующим образом:
if(ptr <> nill )then (* succeeds if p is not null *) if(ptr = nill)then (* succeeds if p is null *)
Паскаль указатели в деталях
У указателей есть много, но простых концепций, и они очень важны для программирования на Паскале. Существует несколько важных концепций указателей, которые должны быть понятны программисту на Паскале:
Для указателей можно использовать четыре арифметических оператора: приращение, уменьшение, +, —
Вы можете определить массивы для хранения нескольких указателей.
Паскаль позволяет вам иметь указатель на указатель и так далее.
Передача аргумента по ссылке или по адресу позволяет включить переданный аргумент в вызывающей подпрограмме вызываемой подпрограммой.
Паскаль позволяет подпрограмме возвращать указатель.