Лекция 12. Динамические массивы. 1. Память компьютера. Адресное пространство. 2. Динамическая память. 3. Адреса и указатели
Лекция 12 Динамические массивы Цели: ü получить представление о понятиях: «память», «адрес» и об адресном пространстве компьютера; ü получить представление о динамической памяти; ü познакомиться с определением указателя, динамического массива и функциями работы с динамической памятью; ü получить представление о поразрядных (побитовых) операциях. 1. Память компьютера. Адресное пространство Память компьютера разбивается на две части: оперативная и внешняя. Внешняя память предназначается для долговременного хранения информации на каком-либо носителе: жестком диске, дискете, компакт-дисках и т. п. Внешняя память компьютера энергонезависима, т. е. при отключении компьютера от электропитания информация с внешних носителей не исчезает. Оперативная память (ОП), наоборот энергозависима, т. е. для сохранения информации требуется постоянное электропитание. Вся ОП разбивается на ячейки одинакового размера, в которых хранится информация. Каждой ячейке поставлено в соответствие конкретное число, называемое адресом ячейки ОП. Особая роль ОП объясняется тем, что процессор может выполнять команды программы только в том случае, когда они загружены в ОП. Кроме того, в ОП загружаются не только инструкции программы, но и ее данные (переменные). Для распознавания переменных и команд приложения на разных этапах его жизненного цикла используются символьные имена, виртуальные и физические адреса. Символьные имена переменных задает программист на этапе написания программы. Виртуальные адреса называют логическими, так как они определяются на этапе трансляции программы в машинный код. Поскольку на этом этапе неизвестно, в каком участке ОП будет размещена программа, то переменным и командам программы транслятор присваивает условные (логические) адреса, считая при этом начальный адрес программы нулевым адресом. Физические адреса – номера (конкретные адреса) ячеек ОП, в которых будут располагаться команды и переменные программы во время ее работы.
Совокупность всех виртуальных адресов приложения называется виртуальным пространством. При загрузке приложения в ОП виртуальные адреса преобразуются в физические. Процесс преобразования виртуальных адресов в физические заключается в запоминании адреса ячейки ОП, начиная с которой в ОП загружается вся программа для выполнения. Далее адреса команд и переменных, которые установил транслятор, будут представлять собой пару чисел (seg, off), где seg – адрес ячейки, с которой начинает располагаться загруженная программа (сегмент), а off – смещение внутри сегмента (логический адрес, полученный командой или переменной на этапе трансляции). Участок ОП, выделенный для выполнения программы, называется адресным пространством этой программы. Таким образом, каждое приложение работает в своем адресном пространстве. 2. Динамическая память При решении задач из предыдущих разделов рассматривались переменные, память под которые отводилась на этапе компиляции программы и сохранялась в течение всей работы программы. Эти величины называют статическими, а выделенную таким образом ОП – статической. Существует другой способ выделения памяти под переменные. В языке С++ память под переменные можно выделять в процессе выполнения программы. Данный способ выделения памяти называют динамическим, переменные, под которые ОП выделялась динамически, – динамическими, а выделенная таким способом память – динамической памятью или кучей. Динамически распределяемая память (куча) – это свободная область ОП, которая не используется программой при ее загрузке в ОП, операционной системой и другими приложениями. Использование динамической памяти дает дополнительные, по сравнению со статической памятью, возможности: 1) при подключении динамической памяти можно увеличить объем обрабатываемых данных; 2) размер динамических данных можно изменять (или вообще динамические переменные удалить в случае их ненадобности).
В то же время динамические переменные не требуют описания в программе, так как память под них выделяется динамически, т. е. в процессе выполнения программы, что делается при помощи указателей. 3. Адреса и указатели Адресом величины называется номер первого байта участка ОП, в котором располагается сама величина. Размер этого участка однозначно определяется типом переменной. Указателем называется переменная, которая содержит адрес другой переменной или указывает адресом на переменную некоторого типа. Тип указателя – беззнаковое целое. Если указатель не указывает ни на какую переменную, то говорят, что он содержит нулевой адрес, записываемый с помощью константы NULL. Объявление указателей: < тип_адресуемой_переменной > *< имя_указателя >; Для того чтобы вывести значение указателя на экран монитора, в функции printf() нужно использовать формат вывода %u. Замечания: 1) указатель всегда содержит адрес нулевого байта адресуемой переменной; 2) тип адресуемой переменной, записанной при объявлении указателя, показывает, сколько байт оперативной памяти (далее ОП) будет адресовать указатель, начиная с нулевого байта адресуемой переменной, например: для символьного типа данных – 1 байт, для целого – 4 байта. Операции над указателями: 1. Унарные операции: & < переменная> – операция получения адреса некоторой < переменной>; *< переменная> – операция получения значения < переменной> по адресу в оперативной памяти (косвенная адресация): int *p, t=4; p=& t; printf(“t=%i\n”, *p); Данный пример можно отобразить в табличной форме.
2. Операции над указателями: Ø присваивание указателю нулевого адреса или адреса некоторой переменной;
Ø увеличение или уменьшение значения указателя; Ø вычитание или сложение двух указателей (в этом случае указатели должны адресовать переменные одного и того же типа); Ø вычитание или прибавление к указателю целого числа. Ø сравнение значений двух указателей при помощи операции отношения.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|