|
Практическое занятие
Указатели и динамические переменные
Цель работы: приобретение навыков в работе с указателями.
Каждый студент выполняет все упражнения.
Упражнения
1.
type
rеf = ^integer;
var
p, q: ref;
Пусть переменные р и q имеют значения, показанные на рисунке. Ответить на следующие вопросы:
1) что является значением переменной р: ссылка на объект (переменную) целого типа или сам этот объект?
Что обозначает р^:
- ссылку на объект целого типа,
- сам этот объект?
- целое 5?
Каковы типы р и p^?
2) что будет выдано на печать в результате выполнения следующих операторов?
P^:= q^;
if p = q then p:=nil else if p^ = q^ then q: = p;
if p = q then q^:= 4;
writeln(p^).
2.
type
D = record
a: boolean;
b, c: ^rеа1
end;
var
r: ^D.
Пусть ссылочная переменная rимеет значение, показанное на рисунке.
Нарисовать, что изменится на рисунке после выполнения следующих операторов:
if r^.b <> nil
then r^.с:=r^.b;
r^.b^:=r^.с^ - 1.4;
r^.а:= r^.b = r^.c.
3.
var
p, q: ^integer;
r: ^char;
Какие из следующих операторов неправильные? Почему и как их исправить?
1) p:=q;
2) q:=r;
3) p:=nil;
4) r:=nil;
5) q=p^;
6) p^:=nil;
7) r^:=p^;
8) q^=ord(r^);
9) if r<>nil then r^:=nil^,
10) if q>nil then q^:=p^;
11) if q = p then write(q);
12) if q<>r then read(r^).
4. Имеется программа
program dynamic;
var x: ^boolean;
y: boolean;
begin
{A} new(x);
{B} x^:=true; y:=not x^;
{C} dispose(x);
{D} writeln(y)
end.
Ответьте на следующие вопросы:
1) какие переменные существуют в каждой из точек А, В, С и D и каковы их значения в эти моменты?
2) почему объекты (переменные), создаваемые процедурой new и уничтожаемые процедурой dispose, называют динамическими? Почему им не дают имена?
3) можно ли переменной х присвоить ссылку на переменную у? Можно ли с помощью процедуры dispose уничтожить переменные х и у?
5.
type
A = ^char;
В = record
f1: char;
f2: A
end;
var p: ^B;
q: A.
Нарисовать структуру значений (как в варианте 2) ссылочных переменных р и q после выполнения следующих операторов:
new(q);
q^:='7';
new(p);
p^.fl:= succ(q^);
p^.f2:=q.
6. Найти и исправить ошибки в следующей программе. Нарисуйте графическое (как в варианте 2) представление в памяти.
program errors;
var
a, b: ^integer;
begin
if a=nil
then read(a);
a^:=5;
b:=nil;
b^:=2;
new(b); read(b^); writeln (b, b^);
new(a); b:=a; dispose(a); b^:=4;
end.
7. Какие следующие описания являются недопустимыми? Если есть, то почему и как их исправить?
type
В =record
p:real;
q:C
end;
C = ^B.
Нарисуйте графическое представление в памяти (как в варианте 2).
8. Допустимы ли в языке Паскаль конструкции
1) P^[2],
2) q^ + 2,
3) q^[2]^,
4) r^^?
Если да, то нарисуйте графическое представление в памяти (как в варианте 2) и приведите примеры использования.
9. Описать переменную р (и, если надо, вспомогательные переменные) и выписать операторы, присваивающие ей указанные значения [см. рисунок (а-г)].
10.
type
цепочка =^звено;
звено = record
элем: integer;
след: цепочка
end;
var
р: цепочка.
Выписать операторы, которые преобразуют значение переменной р, показанное ниже на рисунке, часть а, к значениям, показанным на рисунке, часть 6, в и г. (Звенья, ставшие ненужными, надо уничтожить).
11.
type
chain = ^elem;
elem = record
data: integer;
link: chain
end;
var
p, q: chain.
Нарисовать структуру значения переменной р в памяти(как в варианте 2) после выполнения (независимого) следующих групп операторов:
1) new(p); p^ data:= 4; p^.link:= nil;
2) new(p); p^.data:= 7; p^.link:= p;
3) new(q); q^ data:= 2; q^.link:= nil;
new(p); p^.data:= 1; p^.link:= q;
4) new(p); p^.data:= 5; new(p^.link); p^.link^:= p^.
Дата добавления: 2015-08-29; просмотров: 241 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
http://www.gumer.info/bibliotek_Buks/Polit/peresl/10.php | | | контроля деталей на контрольно-измерительную машину Accura II |