Вторник, 19.03.2024, 13:07
Приветствую Вас, Гость |
Меню сайта
Наш опрос
Нужен ли форум на этом сайте?
Всего ответов: 1296
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Указатели. Операции над указателями

Присваивание

При выполнении этой операции указателю присваивается значение другого указателя или nil.Допускается присваивать указателю только значение того же или неопределенного типа.

Например:

     Var  р1, р2: ^integer;
        
р3: ^
real;
        
р:
pointer;

{допустимые операции}
   
p1:=p2; р:=р3; р1:=р;
   
p1:=nil; р:=nil;

{недопустимые операции}
   
р3:=р2;
p1:=p3;

Получение адреса
Это унарная операция, которая строится из знака операции – символа  @ (коммерческое а) и одного операнда – переменной любого типа.Результат операции – указатель типа pointer, который можно присвоить любому указателю.

Например:
     Var   i: integer;

        
pi: ^integer;

      ...

     
pi:=@i; { указатель pi будет содержать адрес переменной i }

Доступ к данным по указателю

Операция доступа к данным по указателю (операция разыменования) необходима, чтобы получить доступ к переменной по указателю, необходимо после переменной – типизированного указателя поставить знак «^». Полученное значение имеет тип, совпадающий с базовым типом указателя. Нетипизированные указатели разыменовывать нельзя.

Например:

   j
:=
pi^; {переменной j присваивается значение целого, расположенного по адресу pi }
   pi
^:=
pi^+2; {целое значение, расположенное по адресу pi,                                         увеличивается на 2 }
   
Операции отношения

Из всех возможных операций отношения допускаются только операции проверки

1.      равенства (=)

2.      и неравенства (< >).

Эти операции проверяют соответственно равенство и неравенство адресов.

Например:

sign:= pl=p2; { переменная sign логического типа получает                            значение true или false в зависимости от значений                           указателей }

if p1 <> nil then ... { проверка адреса }

 

Указатель на указатель

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

Например, для реализации схемы, изображенной на рисунке, переменную ppi описать и инициализировать следующим образом:

Const i: integer=1;

Var pi: ^integer;

ppi: ^pi;

...

pi:=@i;

ppi:=@pi; ...

Для получения значения переменной i необходимо дважды применить операцию разыменования. В нашем случае  ppi^^  имеет тип integer и равно 1.

 

Функции, работающие с указателями

Функция   ADDR(x): pointer

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

Выполняет те же действия, что и операция «@».

Функция    SEG(x): word

возвращает сегментный адрес указанного объекта.

Функция   OFS(x): word

возвращает смещение указанного объекта.

Функция   CSEG(x): word

возвращает текущее значение сегментного регистра CS – сегментный адрес сегмента кодов.

Функция   DSEG: word

возвращает текущее значение сегментного регистра DS – сегментный адрес сегмента данных.

Функция   PTR(seg, ofs: word):pointer

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

 

Форма входа
Поиск
Мы в сети
Реклама
Для того чтобы не видеть рекламу в правом верхнем углу сайта пройдите простую процедуру регистрации
ФОРУМ
У нас наконецто появился форум! Добро пожаловать! Будьте первыми, задайте направление форуму! =)
--- Не стесняемся - заходим на форум! ---