Операции над указателями
Значение одного указателя можно присваивать другому указателю того же типа. Пусть объявлены переменные VAR Q, R: ^INTEGER и указатель R содержит адрес динамической переменной, значение которой равно 1, а Q - адрес динамической переменной, значение которой равно 2: NEW(Q); NEW(R); Q^:= 2; R^:= 1. Тогда оператор Q:= R перешлет в Q тот же адрес, что хранится в R, т.е. теперь Q будет "показывать" на то же значение (ту же ячейку памяти), что и R, а значение, на которое показывало Q раньше, будет навсегда утеряно. Этот процесс представлен схемой:
Можно присваивать значения одной динамической переменной другой, но того же типа. В этом случае значения обеих динамических переменных становятся равными, но значения указателей при этом не изменяются. Например, выполнена команда присваивания Q^:= R^, в результате получим одинаковое значение у двух переменных, как это показано на схеме:
Обмен значениями динамических переменных не изменяет значения ссылочных переменных. В этом случае, в отличие от оператора Q:=R, после выполнения которого Q и R "смотрят" на одну и ту же динамическую переменную, содержащую 1, каждая переменная Q и R указывает на свою динамическую переменную, хотя они обе содержат 1. ЗАМЕЧАНИЕ. Следует различать пустой и неопределенный указатели. Так, при объявлении с помощью VAR некоторой переменной P (VAR P: ^INTEGER), ее значение является неопределенным. Если же имеет место оператор NEW(P), то ссылочная переменная получает свое конкретное значение - адрес ячейки памяти соответствующей динамической переменной P^. Переменная P может получить значение без оператора NEW только в случае присваивания пустой ссылки P:=NIL или ссылки, уже ранее получившей свое значение с помощью оператора NEW. Итак, никакие действия со ссылочными переменными нельзя производить до действия оператора NEW. В примере VAR I,J: ^ INTEGER; NEW (I); оператор I:= J не законен, т.к. J еще не определена, но допустим оператор J:=I. ПРИМЕР 2. Подсчет числа вхождений заданной буквы в первое по порядку слово максимальной длины из заданного текста, заканчивающегося точкой program FINDLITER; type MAS = array [1..100] of string[1]; LINK = ^MAS; var R, REZSLOVO, TEKSLOVO: LINK; max,i,k,j: integer; S: string[100]; BUKWA: string[1]; begin ¦ max:= -1; i:= 0; new(TEKSLOVO); new(REZSLOVO); ¦ writeln('Введите текст: '); readln(S); repeat ¦ for j:= 1 to length(S) do ¦ begin ¦ ¦ BUKWA:= copy(S,j,1); ¦ ¦ if (BUKWA <> ' ') and (BUKWA <> '.') ¦ then begin i:= i+1; ¦ ¦ TEKSLOVO^[i]:= BUKWA; end ¦ ¦ else if i > max then ¦ ¦ begin max:= i; R:= REZSLOVO; ¦ ¦ REZSLOVO:= TEKSLOVO; ¦ ¦ TEKSLOVO:= R; end; ¦ ¦ i:=0; ¦ end; ¦ until BUKWA = '.'; ¦ writeln('Введите букву: '); read(BUKWA); k:= 0; ¦ for i:= 1 to max do ¦ if BUKWA = REZSLOVO^[i] then k:= k+1; ¦ writeln; ¦ write(' В слово максимальной длины: '); ¦ for j:= 1 to max do write(REZSLOVO^[j]); writeln; ¦ writeln (' буква ',BUKWA,' входит ', k,' раз'); end. Заметим также в заключение, что ссылки, которые указывают на идентичные типы, можно сравнивать друг с другом с помощью знаков "=" и "< >", при этом P = Q, если: а) P = NIL, Q = NIL; b) P и Q указывают на один и тот же динамический объект.
Популярное: Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (248)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |