11.4 Операции над указателями
Значение одного указателя можно присваивать другому указателю того же типа.
Пусть объявлены переменные VAR Q, R: ^INTEGER и указатель R содержит адрес динамической переменной, значение которой равно 1, а Q - адрес динамической переменной, значение которой равно 2:
NEW(Q); NEW(R); Q^:= 2; R^:= 1.
Тогда оператор Q:= R перешлет в Q тот же адрес, что хранится в R, т.е. теперь Q будет "показывать" на то же значение (ту же ячейку памяти), что и R, а значение, на которое показывало Q раньше, будет навсегда утеряно. Этот процесс представлен схемой:
VAR Q,R:^INTEGER; | R | Q | |||||
NEW(R); | R | * | ® | R^ | |||
NEW(Q); | Q | * | ® | Q^ | |||
R^:=1; | R | * | ® | 1 | R^ | ||
Q^:=2; | Q | * | ® | 2 | Q^ | ||
Q:=R | R | * | 1 | R^ или Q^ | |||
| Q | * | 2 | Потеряно | |||
Можно присваивать значения одной динамической переменной другой, но того же типа. В этом случае значения обеих динамических переменных становятся равными, но значения указателей при этом не изменяются. Например, выполнена команда присваивания Q^:= R^, в результате получим одинаковое значение у двух переменных, как это показано на схеме:
До | После | |||||||
R | * | ® | 1 | R | * | ® | 1 | |
Q | * | ® | 2 | Q | * | ® | 1 | |
Обмен значениями динамических переменных не изменяет значения ссылочных переменных. В этом случае, в отличие от оператора 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 указывают на один и тот же динамический объект.
... .....-46.780 Program Prim24; Var r1,r2:real; BEGIN r1:=-46.78; r2:=-46.78; writeln('r1=',r1:12:3,' r2=',r2:9:4); writeln('_______________________________'); readln; END. 6. Массивы 6. 1. Описание массивов В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив. ...
... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой -------------------------------------------------- Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...
... с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: ...
0 комментариев