Указатели. Лекция 5. Виды оперативной памяти презентация

Содержание

Виды оперативной памяти Современные языки программирования работают с тремя видами памяти: статической, автоматической, динамической

Слайд 1Указатели
Лекция 5


Слайд 2Виды оперативной памяти
Современные языки программирования работают с тремя видами памяти:
статической,
автоматической,
динамической


Слайд 3Статическая память
В статической памяти располагаются:
переменные, определения которых расположены вне каких-либо функций

или блоков (глобальные переменные);
переменные, определенные внутри функций или блоков с использованием спецификатора static (локальные статические переменные);
коды функций


Слайд 4Статическая память
Программные объекты (переменные и функции), размещенные в статической памяти, существуют

с момента начала выполнения программы и до ее завершения


Слайд 5Автоматическая память
В автоматической памяти располагаются:
переменные, определения которых расположены внутри каких-либо функций

или блоков (локальные переменные);
фактические параметры функций, передаваемые им при вызове
Переменные, размещенные в автоматической памяти, существуют до момента завершения выполнения функции после чего автоматическая память очищается


Слайд 6Динамическая память
Каждой выполняющейся программе выделяется область памяти, которую называют динамической памятью
Динамическая

память используется для размещения переменных и структур данных, создаваемых в процессе выполнения программ
Такие переменные называются динамическими переменными

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

new и существуют до их удаления унарной операцией delete
Особенности динамических переменных:
эти переменные не имеют имен;
это неинициализированные переменные, поэтому перед использованием они должны быть инициализированы



Слайд 8Адреса оперативной памяти
Оперативная память представляет собой пронумерованную последовательность байт
Номер байта

памяти называется его адресом
Адрес – это целое число, которое принято представлять в шестнадцатеричной системе счисления
Диапазон адресов занимает интервал от 0 до некоторого максимального значения, определяемого архитектурой компьютера и операционной системой


Слайд 9Ячейки памяти
В дальнейшем будем полагать максимальное значение адреса равным 232 -1
Для

каждого типа данных стандартом языка С++ определяется минимально возможное количество байт, отводимое для хранения значений этого типа
Такая область памяти называется ячейкой памяти
Адрес ячейки памяти совпадает с адресом ее первого (младшего) байта


Слайд 10Адреса динамических переменных
Доступ к динамическим переменным возможен только путем непосредственного указания

их адреса в оперативной памяти
Адрес динамической переменной является результатом выполнения операции new
Для хранения адресов используются переменные, называемые указателями


Слайд 11Указатели
Таким образом, указатели – это переменные, хранящие адреса других программных объектов

указатель

p

переменная X с адресом 002EFE80


002EFE80

002EFE80

указатель q

5


Слайд 12Объявление указателей на переменные и константы
Синтаксис объявления указателя на переменную:

*<имя указателя>;
Указатели на константы объявляются со спецификатором const
Например:
float *x, *b; const int *c;
Здесь объявлены два указателя x и b на переменные вещественного типа а также указатель c на целую константу

Слайд 13Указатели-константы
Кроме того, константами могут быть сами указатели, т.е. содержать адреса,

не меняющиеся в течение всего времени их существования
Это свойство указателей устанавливается квалификатором const, записанным после символа ‘*’ в объявлении указателя, например:
double *const cp; // указатель-константа на переменную
const double *const cp; // указатель-константа на константу

Слайд 14Обращение к указанным переменным и константам
Переменная (константа), адрес которой хранится в

некотором указателе, называется указанной переменной (константой)
Синтаксис обращения к указанным переменным и константам:
*<имя указателя>
Здесь символ “*” означает унарную операцию разадресации, результатом которой является получение значения из ячейки памяти, адрес которой хранится в указателе

Слайд 15Инициализация указателей на переменные и константы
Присваивание указателю адреса существующей переменной (константы):
int

a; int *p = &a;
Присваивание значения другого инициализированного указателя:
int *r = p;
Присваивание пустого значения:
int *p = NULL; int *r = 0;
Присваивание адреса памяти в явном виде
int *p = (int*) 28456;

Слайд 16Замечания об инициализации
В первом способе инициализации используется унарная операция получения адреса
Эта

операция может применяться только к поименованным величинам; нельзя получить адрес выражения или неименованной константы
Четвертый способ инициализации используется в системном программировании для доступа к ячейкам памяти специального назначения

Слайд 17Важность инициализации
При объявлении указателя надо сразу выполнять его инициализацию
Непреднамеренное использование неинициализированных

указателей – один из наиболее распространенных источников ошибок в программах!

Слайд 18Динамические переменные
Динамические переменные (константы) создаются в динамической области памяти (heap –

куча)
Время жизни таких переменных – от момента создания до завершения программы или до явного освобождения памяти
Доступ к динамическим переменным и константам осуществляется с помощью указателей

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

в памяти
Для выполнения этой операции можно используют унарную операцию new
Синтаксис операции:
new <тип> [(<инициализирующее выражение>)]
Например:
int* m = new int;
float* x = new float(56);


Слайд 20Удаление динамических переменных
Для удаления динамических переменных и констант с освобождением памяти

используют унарную операцию delete:
delete <имя указателя>
Память, отведенная под динамические объекты, автоматически освобождается, когда указатели на них выходят из области своего действия


Слайд 21Сборка мусора
Вместо использования операций delete можно просто присваивать переменной-указателю значение NULL
В

этом случае в оперативной памяти остается неиспользуемая динамических переменная
В состав операционной системы входит подсистема garbage collector («сборщик мусора»), назначением которой является автоматическое удаление из динамической памяти неиспользуемых переменных

Слайд 22Пример программы
Программа «Объявление указателей»
Листинг программы


Слайд 23Указатели void
Синтаксис объявления
void *
Применяется в тех случаях, когда конкретный тип

объекта, адрес которого требуется хранить, не определен


Слайд 24Указатели void
Указателю на void можно присвоить значение указателя любого типа, но

перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется произвести явное преобразование к нужному типу
Например:
float a = 7; void *r = &a;
cout << “*r = “ << *(float*)r << endl;

Слайд 25Операции с указателями
Кроме четырех рассмотренных выше унарных операций (*, &, new

и delete) для указателей определены четыре бинарных арифметических операции:
инкремент,
декремент,
сложение с константой,
вычитание
Арифметические операции изменяют значения указателей

Слайд 26Операции с указателями
Операция инкремента (декремента) увеличивает (уменьшает) значение указателя, связанного с

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

Слайд 27Операции с указателями
Разность двух указателей одного типа равна разности их значений,

деленной на размер данных связанного с ними типа
Суммирование двух указателей не допускается
Например для указателей p и q:
int *p = new int, *q = new int;
разность p – q будет иметь значение в 4 раза меньшее разности их значений
Листинг программы


Слайд 28Указатели и массивы
В языке C++ указатели играют очень важную роль, обеспечивая

ряд особенностей в работе с массивами и строками, которые отсутствуют в алголоподобных языках типа Pascal

Слайд 29Указатели и массивы
В языках C и C++ существует тесная связь

между массивами и указателями – имя массива фактически является указателем-константой, инициализированным адресом начального элемента массива
Поэтому возможна следующая инициализация указателя:
float a[10]; float* p = a;
без выполнения операция получения адреса, примененной к имени массива (&a)

Слайд 30Указатели и массивы
Для обращения к элементам массива можно использовать операции адресной

арифметики
Например, присваивание
float x = *(a + i);
эквивалентно
float x = a[i];
Пример использования имени массива как указателя
Выполнение программы

Слайд 31Динамические массивы
Использование указателей позволяет создавать массивы, размер которых определяется уже в

процессе выполнения программы
Такие массивы принято называть динамическими
Однако следует иметь в виду, что будучи однажды заданным размер динамического массива уже не может быть изменен

Слайд 32Создание динамического массива
Для создания динамического массива необходимо объявить указатель, который будет

играть роль имени массива:
<тип элементов> *<имя массива>
Затем делается запрос на выделение памяти для размещения массива
<имя массива> = new <тип элементов> “[“<выражение целого типа>”]”
Значение выражения, помещенного в квадратные скобки, и будет размером динамического массива

Слайд 33Освобождение памяти
Динамический массив не инициализируется и его элементы не обнуляются
Например:
cin >>

n;
double *a = new double [n];
Освобождение памяти, выделенной под динамический массив осуществляется операцией
delete [ ] <имя массива>
Пример работы с динамическим массивом
Листинг программы



Слайд 34Двумерные массивы
Двумерные массивы с фиксированными на этапе компиляции размерами объявляются следующим

образом:
<тип элементов> <имя массива> “[“<размер1>”]” “[“<размер2>”]” [=“{“<список констант>”}”],
где <размер1> и <размер2> – константные выражения

Слайд 35Пример определения двумерного массива
Например:
const int n = 2;
int a [n] [2

* n] = {{1, 3, 5, 7}, {2, 4, 6, 8}};
Здесь описан прямоугольный массив из двух строк и четырех столбцов
Разбиение списка констант в инициализаторе на подсписки можно было не производить:
int a [n] [2 * n] = {1, 3, 5, 7, 2, 4, 6, 8};

Слайд 36Двумерные массивы
В двумерном массиве a[i] является указателем-константой на начало i–й строки,

т.е. содержит адрес элемента a[i] [0], поэтому *(a[i] + j) эквивалентно a[i] [j]
Следовательно, двумерный массив фактически является одномерным массивом указателей на одномерные массивы
Этот принцип построения распространяется на массивы любой размерности

Слайд 37Двумерный массив
a
int a [5] [4]


Слайд 38Динамические двумерные массивы
Для создания динамического двумерного массива следует объявить указатель на

массив указателей:
<тип элементов*> *<имя массива>
Далее следует запросить выделение памяти под этот массив:
<имя массива> = new <тип элементов*> “[“<выражение целого типа>”]”

Слайд 39Динамические двумерные массивы
Далее следует инициализировать каждый из элементов массива указателей:

массива> “[“<индексное выражение>”]”= new <тип элементов>“[“< выражение целого типа>”]”


Слайд 40Зубчатые массивы
Возможность задавать длину для каждой строки двумерного массива позволяет формировать

массивы произвольной формы, отличной от прямоугольной
Такие массивы называются зубчатыми (jagged arrays)
Пример определения зубчатого массива
Листинг программы
Удаление многомерных динамических массивов также производится операцией delete [ ]



Слайд 41Конец лекции


Слайд 42Структура физической памяти
Логическому делению оперативной памяти на статическую, автоматическую и динамическую

соответствует деление физической памяти на несколько участков, называемых сегментами
Сегментная структура физической памяти обеспечивает, кроме того, раздельное хранение программ и данных


Слайд 43Сегменты оперативной памяти


Слайд 44Сегменты и виды памяти
Коды функций размещаются в сегменте команд CS
Статические переменные

размещаются в сегменте данных DS
Автоматические переменные размещаются в сегменте стека SS
Динамические переменные размещаются в дополнительном сегменте данных ES

Слайд 45Виды указателей
Указатели могут использоваться для доступа как к статическим (поименованным), так

и к динамическим (непоименованным) объектам
Обращение к самим указателям осуществляется по имени, также как к другим статическим переменным
В языке C++ различают три вида указателей:
указатели на переменные,
указатели на функции,
void-указатели


Слайд 46Указатели и строки
Пример работы со строками через указатели
Листинг программы


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика