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

Алгоритмический язык Паскаль
Базовые структуры языков программирования Структура Паскаль - программы < 5; 1.2 > -6.8; 'A' < 'C'; true > false; MO > TH Операторы процедур. Ввод/вывод информации СТРУКТУРНЫЕ ОПЕРАТОРЫ. ОРГАНИЗАЦИЯ ВЕТВЛЕНИЙ И ЦИКЛОВ Организация циклов. Операторы повторения ОРГАНИЗАЦИЯ ПОДПРОГРАММ. ПРОЦЕДУРЫ И ФУНКЦИИ Функции пользователя. Рекурсивные функции МАССИВЫ. ДАННЫЕ ТИПА ARRAY Способы работы с массивами Массивы литер Процедура STR(преобразование в строку) Печать множеств Оператор WITH Определение и описание файла Основные приемы работы с файлами ССЫЛОЧНЫЙ ТИП. ПЕРЕМЕННЫЕ С УКАЗАТЕЛЯМИ Создание динамических переменных. Процедура NEW Операции над указателями Действия над динамическими переменными Заполнить поля ELEM значениями UKSTR^.ELEM:='P'; ПОНЯТИЕ ОБ ИНФОРМАЦИИ. ДАННЫЕ. СТРУКТУРЫ ДАННЫХ Прямой выбор Массив дан случайным образом СТРУКТУРЫ ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА. ЛИНЕЙНЫЕ СПИСКИ Стек Общие приемы работы с линейными списками ДЕРЕВЬЯ Основные операции над деревьями Некоторые дополнительные возможности работы с динамическими структурами
274963
знака
85
таблиц
0
изображений

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 указывают на один и тот же динамический объект.



Информация о работе «Алгоритмический язык Паскаль»
Раздел: Информатика, программирование
Количество знаков с пробелами: 274963
Количество таблиц: 85
Количество изображений: 0

Похожие работы

Скачать
168304
7
26

... .....-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. Описание массивов В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив. ...

Скачать
112819
0
0

... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой --------------------------------------------------   Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...

Скачать
91405
0
0

... с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: ...

0 комментариев


Наверх