Основы программирования — второй семестр 08-09; Михалкович С.С.; II часть — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Динамические структуры данных)
(Указатели)
Строка 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 соответственно.

Переменная (или константа), хранящая адрес, называется указателем.

Для чего нужны указатели

Указатели повышают гибкость доступа к данным:

  1. Вместо самих данных можно хранить указатель на них. Это позволяет хранить данные в одном экземпляре и множество указателей на эти данные. Через разные указатели эти данные можно обновлять (пример — корпоративная БД).
  2. Указателю можно присвоить адрес другого объекта (вместо старого появился новый телефонный справочник).
  3. С помощью указателей можно создавать сложные структуры данных.

Подробнее об указателях

Указатели делятся на:

  • Типизированные (указывают на объект некоторого типа)
    Имеют тип: ^<тип>
    Пример. ^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).

Управляемая динамическая память и ее возврат. Отсутствие утечки памяти.

Динамические структуры данных. Списки

Виды списков. Рисунки.

Односвязные линейные списки

Класс узла списка (шаблонный)

Стандартные операции с односвязными линейными списками

  • Вставка элемента в начало
  • Удаление элемента из начала
  • Вставка после текущего
  • Удаление после текущего
  • Проход по списку

Двусвязные линейные списки

Стандартные операции с двусвязными линейными списками

  • Инициализация
  • Добавление в начало, конец
  • Удаление из начала, конца
  • Вставка элемента перед текущим, после текущего
  • Удаление текущего
  • Объединение двух списков

Помещение операций по работе со списком внутрь класса