Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование 2 семестр 1 курс.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
523.82 Кб
Скачать

Основные операции с ссылочными переменными

Будем рассматривать операции как примеры обращения по ссылке к статическим данным :

  1. Взятие адреса или операция адресация: для того, чтобы связать ссылочную переменную со значением некоторого элемента памяти необходимо этой переменной присвоить адрес. Для взятие адреса используются операция : @ , которая ставится перед переменной , адрес который необходимо получить . Унарная операция .

Пример :

Var

I:integer;

P:^integer;

Begin

……

I:=7;

P:=@i;

В этом случае переменная p будет ссылаться по адресу на область памяти , связанную с переменной i. Для того , чтобы ссылка и указатель ни на что не указывали или присваивается пустое значение ,которое обозначается служебном словом Nil : p:Nil . Перед использованием ссылочных переменных и указателей необходимо следить за тем , чтобы они были проинициализированы доступными и логически верными значениями адресов . Неправильная инициализация может привести к непредсказуемым результатам .

  1. Разыменование или раз адресация : является основной операцией работы с указателями , суть заключается в том , чтобы взять или поместить некоторое значение по адресу Ю находящихся в ссылочной переменной : ^ , который ставиться после ссылочной переменной Пример :

Var

I:integer;

P:^integer;

Begin

……

I:=7;

P:=@i;

P^:=2;

Wrieln(p^);

Writeln(i);

При выполнение операции разыменования важную роль играет базовый тип , он указывает какой объем памяти буде обрабатываться и с каким типом будет работать .

Операция разыменования к указателям типа pointer .

Пример :

Var

I:integer;

P:pointer;

Begin

……

I:=7;

P:=@i;

P^:=2;

Writeln(p^); (x)

Данные операции могут быть выполнены , так как указатель типа pointer не обладает информацией о том , с каким объемом памяти надо работать . Поэтому при использовании типа pointer для обращения к данным необходимо произвести приведение типов , который укажет какой объем данных необходимо обрабатывать

Integer (p^):=2 ;

Writeln(integer(p^));

При работе с ссылками необходимо ввести четкий контроль за сохранением соответствия базовым типом ссылочной переменной и базовым типом переменной , на данные которые эта ссылка ссылается . Несоответствие типов может привести к нежелательным результатам :

a)

var

I,j,k:byte;

P1,p2:^byte;

Begin

I:=1;j:=2;k:=3;

P1:=@i; p2:=@j;

Writeln (p1^); 1

Writeln(p2^); 2

  1. var

I,j,k:byte;

P1,p2:^integer;

Begin

I:=1;j:=2;k:=3;

P1:=@i; p2:=@j;

Writeln (p1^); 513

Writeln(p2^); 770

  1. Присваивание ссылочной переменных и указателей .

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

Var

I,j:byte;

P1,p2:^byte;

……

P1:=@i;

P2:=@j;

P1:=p2;

Присваивание разыменование ссылок

При этом учитывается совместимость по типу данных , на которые они ссылаются аналогично учету совместимости при обычном присваивании

Присваивание ссылок и указателей типа pointer

Операции прямого присваивания является допустимой , так как ссылочная переменные и указатели совместны по адресу :

Var

P1:^integer ;

P2:pointer;

P1:=p2;

Однако они не является совместимыми по данным (у указателя pointer не определен объем памяти , с которым он будет работать при разыменование в отличие от ссылки ). Поэтому операции p1^:=p2; не выполняется . Для выполнения ее необходимо привести раз именованный указатель к базовому типу ссылки , то есть p1^:=integer(p2^);