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