Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Некоторые свойства указателей



ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОУВПО

«\ВОРОНЕЖСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ »

КАФЕДРА МАТЕМАТИЧЕСКОГО МОДЕЛИРОВАНИЯ

ИНФОРМАЦИОННЫХ И ТЕХНОЛОГИЧЕСКИХ СИСТЕМ

 

РАБОТА С ДИНАМИЧЕСКИМИ СТРУКТУРАМИ ДАННЫХ

 

Методические указания к практическим занятиям

по курсу “Технологии и методы программирования”

 

Для студентов, обучающихся

По направлению 090303 «Информационная безопасность автоматизированных систем»

Дневной формы обучения

 

 

ВОРОНЕЖ 2010


УДК 681.3.06

Работа с динамическими структурами данных [Текст]: метод. указания к практическим занятиям по курсу “Технологии и методы программирования” / Воронеж. гос. технол. акад.; сост. И. Е. Медведкова, С. А. Просвирин. Воронеж, 2005. 24 с.

Методические указания разработаны в соответствии с требованиями ООП подготовки специалистов по направлению по направлению 090303 «Информационная безопасность автоматизированных систем» Они предназначены для закрепления теоретических сведений для работы с динамическими структурами данных, а также задания для практических занятий и контрольные вопросы.

Ил. 16. Табл. 2. Библиогр.: 4 назв.

 

 

Составители доцент И.Е. МЕДВЕДКОВА,

ст. преподаватель С.А. ПРОСВИРИН

 

Научный редактор д.т.н., профессор Г.В. АБРАМОВ

 

Рецензент зав. кафедрой ВГЛТА д.т.н., профессор В.Е. МЕЖОВ

 

Печатается по решению

редакционно-издательского совета

Воронежской государственной технологической академии

 

Ó Медведкова И.Е.,

Просвирин С.А., 2010

Ó Воронежская

государственная

технологическая

академия, 2010

 

Оригинал-макет данного издания является собственностью Воронежской государственной технологической академии, его репродуцирование (воспроизведение) любым способом без согласия академии запрещается.


Цель работы-обучение студентов практическим навыкам работы с динамическими структурами данных.

Основные теоретические положения

Действия с указателями

Таблица 1 Основные действия с указателями
Действие Результат
1. Объявление type Pint=^integer; var a,b: Pint;
2. Выделение памяти New(a); New(b);
3. Занесение информации a^:=1; b^:=2;
4. Копирование информации a^:=b^;
5. a). Копирование адреса a:=b;
5. б). Dispose (a); a:=b;
6. b:=nil;

(^) – указатель на переменную содержит некоторый адрес. Основные действия с указателями проиллюстрированы в табл.1

Некоторые свойства указателей.

1. Запрещено присваивать типизированному указателю указатель на другой тип.

2. Переменные типа “указатель” нельзя использовать в процедурах ввода- вывода (write, read).

3. Возможен просмотр значений указателей в режиме отладки в окне Watch.Для этого стандартным образом запрашивается стандартная переменная типа “указатель”, после чего в окне получаем:

P=Ptr ($271F, $11FØ),

что отражает структуру данных типа “указатель”, которые представляют собой два двухбайтных слова типа “Word”.

Первое из них в нашем примере 271F –номер сегмента, каждый сегмент равен 64К.

Второе число 11FØ – смещение относительно начала сегмента, начиная с этого адреса, выделяется память под переменную.

Динамические данные

Работа с указателями проиллюстрирована в таблице 2 .

Таблица 2. Работа со статическими и динамическими данными

Структура данных Обычные переменные Динамические переменные
1. Простая переменная type Tint =1..100; var X : Char; Y : Tint Begin X : = ' * ' ; Y := 3; end. type Tint = 1..100; var PX : ^Char; PY : "Tint; begin New (PX); N ew (PY); PX^ : = ' * ' ; PY^ := 3; Dispose (PX) ; Dispose (PY); end.
2. Массив type Vect = array[1..3] of Byte; var X : Vect; i : Byte; begin for i:=l to 3 do Read ( X[i] ); end. type Vect = array[l..3] of Byte; var PX : ^Vect; i : Byte; begin New (PX); for i:=l to 3 do Read ( PX^[i] ) ; . . . Dispose (PX) ; end.
3. Запись type Rec = record a : Char; b : Byte end; var X : Rec; begin X.a := '*'; X.b := 7; end. type Rec = record a : Char; b : Byte end; var PX : ^Rec; begin New (PX); PX^.a := '*'; PX^.b := 7; . . . Dispose (PX) ; end.

Рассмотрим пример:

Ввести в память машины 500 целых чисел с помощью генератора случайных чисел, а затем вывести их в обратном порядке.

Решим эту задачу при помощи динамического массива:

program example;

type

Mas = array[1..500] of real; {Тип-массив из 500 чисел}

Pmas = ^Mas; {Тип-указатель на массив из 500 чисел}

const

P: Pmas = nil; {Указатель}

var

i: integer; {Параметр цикла}

begin

New(P); {Выделение памяти для массива на500 чисел}

if P <> nil then {Если память выделена …}

begin

for i:=1 to 500 do {Цикл заполнения массива}

P^[i]:=random(100);

for i:=500 downto 1 do {Цикл вывода чисел}

writeln(P^[i]); {Вывод числа}

dispose(P); {Освобождение области}

end;

end.

Работа с указателями требует осторожности, так как при неправильной работе с ними можно либо потерять динамическую память, либо вызвать ошибку времени выполнения. Если попытаться распределить новую динамическую память с помощью указанных выше стандартных процедур через переменную P, которая уже указывает на выделенную память, то при этом адрес старой выделенной памяти «забывается» и, если нет других указателей на эту память, она становится недоступной, в том числе и для освобождения. Если же попытаться освободить память с помощью переменной P, которая не указывает в данный момент на какую-либо память (например, память уже была освобождена и происходит попытка повторного освобождения памяти), то возникнет ошибка времени выполнения и программа прекратит свою работу. Наконец, если попытаться работать с динамической памятью через переменную P, которая в настоящий момент ни на что не указывает, возможны большие неприятности, вплоть до развала операционной системы.

К сожалению, процедура Dispose не задает после освобождения памяти соответствующей переменной значение nil. Эту операцию при многократном использовании указателя должен выполнить сам программист, а обращаться к памяти (в том числе и освобождать ее) можно только в том случае, когда указатель не равен nil. Целесообразно и в самом начале программы указателям задать значение nil, означающее, что для них еще не выделена динамическая память. Такие дополнительные операции позволят избежать многих неприятных ситуаций при работе программы.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.