Основы программирования — второй семестр 08-09; Михалкович С.С.; II часть — различия между версиями
Admin (обсуждение | вклад) (→Динамические структуры данных) |
Juliet (обсуждение | вклад) (→Указатели) |
||
Строка 1: | Строка 1: | ||
<small>Лекция 3</small> | <small>Лекция 3</small> | ||
− | + | == Указатели == | |
− | |||
− | Для чего нужны указатели | + | === Адрес === |
+ | Оперативная память состоит из последовательный ячеек. Каждая ячейка имеет ''номер'', называемый '''адресом'''. | ||
+ | <br />В 32-битных системах можно адресовать 2<sup>32</sup> байт (<math>\approx \;</math> 4Гб) памяти, в 64-битных — 2 <sup>64</sup> соответственно. | ||
+ | |||
+ | Переменная (или константа), хранящая адрес, называется '''указателем'''. | ||
+ | |||
+ | === Для чего нужны указатели === | ||
+ | Указатели повышают '''''гибкость доступа к данным''''': | ||
+ | # Вместо самих данных можно хранить указатель на них. Это позволяет хранить данные в одном экземпляре и множество указателей на эти данные. Через разные указатели эти данные можно обновлять (<u>пример</u> — корпоративная БД). | ||
+ | # Указателю можно присвоить адрес другого объекта (вместо старого появился новый телефонный справочник). | ||
+ | # С помощью указателей можно создавать сложные '''структуры данных'''. | ||
+ | |||
+ | === Подробнее об указателях === | ||
+ | Указатели делятся на: | ||
+ | * '''''Типизированные''''' (указывают на объект некоторого типа) <br />Имеют тип: <tt>'''^<тип>'''</tt> <br /><u>Пример</u>. <tt>^integer</tt> — указатель на integer | ||
+ | * '''''Бестиповые''''' (хранят адрес ячейки памяти неизвестного типа) <br />''Преимущество:'' могут хранить что угодно <br />Имеют тип: <tt>'''pointer'''</tt> | ||
+ | |||
+ | <u>''Пример кода''</u>. | ||
+ | <source lang="Pascal">var | ||
+ | i: integer := 5; | ||
+ | r: real := 6.14; | ||
+ | |||
+ | pi: ^integer; | ||
+ | pr: ^real; | ||
+ | |||
+ | begin | ||
+ | pi := @i; | ||
+ | pr := @r; | ||
+ | pi := @r; // ОШИБКА компиляции | ||
+ | end.</source> | ||
+ | <tt>'''@'''</tt> — унарная операция '''взятия адреса''' | ||
+ | <xh4>Операция разадресации (разыменования)</xh4> | ||
+ | <source lang="Pascal">var | ||
+ | i: integer := 5; | ||
+ | pi: ^integer; | ||
+ | |||
+ | begin | ||
+ | pi := @i; | ||
+ | |||
+ | pi^ := 8 - pi^; | ||
+ | writeln(i); // 3 | ||
+ | end.</source> | ||
+ | <tt>'''^'''</tt> — операция '''разыменования''' | ||
+ | <br /><tt>'''pi^'''</tt> — то, на что указывает pi, т.е. другое имя i или '''ссылка''' на i. | ||
+ | |||
+ | Тут надо вспомнить определение ссылки: | ||
+ | <br />'''Ссылка''' — другое имя объекта. | ||
− | |||
Нулевой указатель. | Нулевой указатель. | ||
− | |||
− | |||
Указатели и явное приведение типа. Пример: типы pointer, pinteger и preal. | Указатели и явное приведение типа. Пример: типы pointer, pinteger и preal. | ||
Строка 22: | Строка 64: | ||
* Висячие указатели | * Висячие указатели | ||
* Утечка памяти | * Утечка памяти | ||
+ | <source lang="Pascal"></source> | ||
+ | <xh4></xh4> | ||
===Классы-начало=== | ===Классы-начало=== |
Версия 17:32, 24 февраля 2009
Лекция 3
Содержание
Указатели
Адрес
Оперативная память состоит из последовательный ячеек. Каждая ячейка имеет номер, называемый адресом.
В 32-битных системах можно адресовать 232 байт (<math>\approx \;</math> 4Гб) памяти, в 64-битных — 2 64 соответственно.
Переменная (или константа), хранящая адрес, называется указателем.
Для чего нужны указатели
Указатели повышают гибкость доступа к данным:
- Вместо самих данных можно хранить указатель на них. Это позволяет хранить данные в одном экземпляре и множество указателей на эти данные. Через разные указатели эти данные можно обновлять (пример — корпоративная БД).
- Указателю можно присвоить адрес другого объекта (вместо старого появился новый телефонный справочник).
- С помощью указателей можно создавать сложные структуры данных.
Подробнее об указателях
Указатели делятся на:
- Типизированные (указывают на объект некоторого типа)
Имеют тип: ^<тип>
Пример. ^integer — указатель на integer - Бестиповые (хранят адрес ячейки памяти неизвестного типа)
Преимущество: могут хранить что угодно
Имеют тип: pointer
Пример кода.
var
i: integer := 5;
r: real := 6.14;
pi: ^integer;
pr: ^real;
begin
pi := @i;
pr := @r;
pi := @r; // ОШИБКА компиляции
end.
@ — унарная операция взятия адреса <xh4>Операция разадресации (разыменования)</xh4>
var
i: integer := 5;
pi: ^integer;
begin
pi := @i;
pi^ := 8 - pi^;
writeln(i); // 3
end.
^ — операция разыменования
pi^ — то, на что указывает pi, т.е. другое имя i или ссылка на i.
Тут надо вспомнить определение ссылки:
Ссылка — другое имя объекта.
Нулевой указатель.
Указатели и явное приведение типа. Пример: типы pointer, pinteger и preal. Доступ к памяти, имеющей другое внутреннее представление.
Динамическая память. Явное выделение динамической памяти. Процедуры New и Dispose.
Ошибки при работе с динамической памятью
- Использование неинициализированного указателя
- Висячие указатели
- Утечка памяти
<xh4></xh4>
Классы-начало
Переменная типа класс как ссылка. Сравнение с записями.
Вызов конструктора и выделение динамической памяти.
Шаблоны классов.
Решение проблемы освобождения памяти, занимаемой объектами классов: сборка мусора (.NET, Java).
Управляемая динамическая память и ее возврат. Отсутствие утечки памяти.
Динамические структуры данных. Списки
Виды списков. Рисунки.
Односвязные линейные списки
Класс узла списка (шаблонный)
Стандартные операции с односвязными линейными списками
- Вставка элемента в начало
- Удаление элемента из начала
- Вставка после текущего
- Удаление после текущего
- Проход по списку
Двусвязные линейные списки
Стандартные операции с двусвязными линейными списками
- Инициализация
- Добавление в начало, конец
- Удаление из начала, конца
- Вставка элемента перед текущим, после текущего
- Удаление текущего
- Объединение двух списков
Помещение операций по работе со списком внутрь класса