Паскаль - указатели

Указатели в Паскале легко и весело изучать. Некоторые задачи программирования на языке Pascal легче выполнять с помощью указателей, а другие задачи, такие как распределение динамической памяти, не могут выполняться без использования указателей. Таким образом, становится необходимым изучить указатели, чтобы стать идеальным программистом на 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

Печать адреса памяти на Паскале

В Паскале мы можем присвоить адрес переменной переменной-указателю, используя оператор адреса (@). Мы используем этот указатель для управления и доступа к элементу данных. Однако, если по какой-то причине нам нужно работать с самим адресом памяти, нам нужно сохранить его в переменной типа word.

Давайте расширим приведенный выше пример, чтобы вывести адрес памяти, хранящийся в указателе 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значение переменной-указателя в случае, если у вас нет точного адреса для присвоения. Это делается во время объявления переменной. Указатель, которому присвоено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

Чтобы проверить наличие nil указатель, вы можете использовать оператор if следующим образом:

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Указатели Паскаля в деталях

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

Старший Нет Концепция и описание
1 Паскаль - арифметика указателя

Есть четыре арифметических оператора, которые можно использовать с указателями: инкремент, декремент, +, -

2 Паскаль - Массив указателей

Вы можете определить массивы для хранения нескольких указателей.

3 Паскаль - указатель на указатель

Паскаль позволяет вам иметь указатель на указатель и так далее.

4 Передача указателей на подпрограммы в Паскале

Передача аргумента по ссылке или по адресу позволяет изменять переданный аргумент в вызывающей подпрограмме вызываемой подпрограммой.

5 Указатель возврата из подпрограмм в Паскале

Паскаль позволяет подпрограмме возвращать указатель.