Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Razdel_1_2007.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
421.96 Кб
Скачать

6. Вказівники та посилання. Адреси об’єктів в пам’яті. Динамічні структури даних.

Указатель — это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера. Например, если одна переменная содержит адрес другой переменной, то говорят, что первая переменная указывает (ссылается) на вторую.

Объявление указателя состоит из имени базового типа, символа * и имени переменной. Общая форма объявления указателя следующая:

тип *имя;

Здесь тип — это базовый тип указателя, им может быть любой правильный тип. Имя определяет имя переменной-указателя.

В языке С определены две операции для работы с указателями: * и &. Оператор & — это унарный оператор, возвращающий адрес своего операнда. Например, оператор

m = &count;

присваивает переменной m адрес переменной count.

Вторая операция для работы с указателями выполняет действие, обратное по отношению к &. Оператор * — это унарный оператор, возвращающий значение переменной, расположенной по указанному адресу. Например, если m содержит адрес переменной count, то оператор

q =*m;

присваивает переменной q значение переменной count.

В языке С допустимы только две арифметические операции над указателями: суммирование и вычитание.

Операции адресной арифметики не ограничены увеличением и уменьшением. Например, к указателям можно добавлять целые числа или вычитать из них целые числа. Выполнение оператора p1 = p1 + 12; "передвигает" указатель p1 на 12 объектов в сторону увеличения адресов.

Кроме суммирования и вычитания указателя и целого, разрешена еще только одна операция адресной арифметики: можно вычитать два указателя. Благодаря этому можно определить количество объектов, расположенных между адресами, на которые указывают данные два указателя; правда, при этом считается, что тип объектов совпадает с базовым типом указателей. Все остальные арифметические операции запрещены.

Иногда указатель может ссылаться на указатель, который ссылается на число. Это называется многоуровневой адресацией.

Переменная, являющаяся указателем на указатель, должна быть соответствующим образом объявлена. Это делается с помощью двух звездочек перед именем переменной. Например, в следующем операторе newbalance объявлена как указатель на указатель на переменную типа float:

float **newbalance;

Следует хорошо понимать, что newbalance — это не указатель на число типа float, а указатель на указатель на число типа float.

Ссылка была введена в С++ для упрощения передачи сложных структур в функции, чтобы избежать их копирования, которое сильно ухудшит скоростные показатели программы. Чтобы представить себе как она работает достаточно одного слова - псевдоним. Т.е. если у вас есть переменная x, то вы можете сделать ей псевдоним с именем y. Если вы измените y, то изменится и x, а если измените x, то аналогично изменится и y.

Динамические структуры данных – это структуры данных, память под которые выделяется и освобождается по мере необходимости.

Динамическая структура данных характеризуется тем что:

  • она не имеет имени;

  • ей выделяется память в процессе выполнения программы;

  • количество элементов структуры может не фиксироваться;

  • размерность структуры может меняться в процессе выполнения программы;

  • в процессе выполнения программы может меняться характер взаимосвязи между элементами структуры.

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

struct Node{

Data d; // тип данных Data должен быть определен заранее

Node *р:

};

К динамическим структурам относятся:

  • однонаправленные (односвязные) списки. В односвязном списке каждый элемент информации содержит ссылку на следующий элемент списка.

  • двунаправленные (двусвязные) списки. Двусвязный список состоит из элементов данных, каждый из которых содержит ссылки как на следующий, так и на предыдущий элементы.

  • циклические списки. Последний элемент списка содержит указатель, связывающий его с первым элементом, то есть нет пустых указателей.

  • стек («последним пришёл – первым вышел»). Добавление элемента – в вершину стека, удаление – из вершины стека.

  • Дек (двухсторонняя очередь) называется структура данных, в которую можно удалять и добавлять элементы как в начало, так и в конец.

  • Очередь ( «первый пришёл – первый вышел»). Добавление элемента – в конец очереди, удаление – только из начала.

  • бинарные деревья. Древовидная структура данных, в которой каждый узел имеет не более двух потомков (детей).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]