oap_12_13(динамические переменные).ppt
- Количество слайдов: 58
Работа с динамической памятью. Динамические массивы. Управление памятью.
Динамические переменные и массивы ► СТАТИЧЕСКИЙ -- объект, создаваемый при трансляции ► ДИНАМИЧЕСКИЙ -- при выполнении программы. «куча» или «свободное хранилище» .
недостатки - переменные занимают области сегмента данных программы и увеличивают размер программного файла; ► -размерность таких массивов как для внешних переменных (сегмент данных), так и для автоматических (стек) бывает ограничена; ► -заранее установленные размерности могут не соответствовать текущим соотношениям объемов входных данных ►
возможные изменения размерности данных в программе ► Динами ческие -статический вариант, когда размерность данных устанавливается при трансляции; ► -размерность данных становится известной в некоторый момент работы программы, затем установленная размерность данных не изменяется; ► -размерность данных меняется в течение всего времени работы программы.
Основные свойства динамических переменных: ► создаются и уничтожаются вызовами функц. или опер. ; ► количество и размерность может меняться; ► не имеет имени, доступ к ней возможен только через указатель; ► в "куче" выделяется свободная память необходимого размера и возвращается указатель на нее (адрес); ► функции уничтожения – передается указат.
Следствия ► 1. если указ. потерян – то существует, но не доступна ► 2. дин. перем. - м. содержать один или несколько указателей на другие дин. переменные (структуры) ► 3. отвественность за корректность – программист.
Работа с динамической памятью ► на “высоком уровне” - операторы –С++ ► на “низком” уровне – функции - С void*
Основные функции (C) #include <alloc. h> #include <cstdlib> void *malloc(unsigned size); // выделить область памяти размером // в size байтов и возвратить адрес void * calloc(unsigned size, unsigned m) NULL - в случае неудачи
void free(void *p); // освободить область памяти, // выделенную по адресу p
void *realloc (void *p, unsigned size); // расширить выделенную область памяти // до размера size, при изменении адреса // переписать старое содержимое блока NULL
Пример создания простой динамической переменной:
Операторы new и delete (C++) отличительные особенности ►- в операторе new указывается тип создаваемой переменной, а не размерность, при этом оператор возвращает указатель того же самого типа; ► - если выделяется память под массив динамических переменных, то в операторе new добавляются квадратные скобки.
► формат указатель = new тип; (указатель ==NULL в случае ошибки) NULL – библиотечная константа (0) запрашивает у ОС выделение объема памяти delete указатель; находит в динамически распределяемой области выделенную память и помечает ее как неиспользованную
► формат для массивов указатель = new тип [количество]; (указатель ==NULL в случае ошибки) delete [] указатель;
// Обычная динамическая переменная
// Массив динамических переменных
Динамические массивы ► функция возвращает указатель на создаваемый динамический массив
s v
Динамические массивы и проблемы размерности данных ►- неэффективный: под каждый вид данных зарезервировать память заранее “по максимуму” ► -в какой-то момент времени выполнения программа “узнает”, какова будет размерность обрабатываемых данных и создать динамический массив такой размерности ► -создание такой структуры данных, которая автоматически увеличивает свою размерность при ее заполнении. ВИРТУАЛЬНЫЙ МАССИВ.
Пример реализации виртуального массива Функция возвращает указатель на создаваемый динамический массив. Размерность массива увеличивается при заполнении с кратностью N – N, 2 N, 3 N. . .
p = (int*) realloc(p, sizeof(int)*(i+1+N));
Операции и библиотечные функции используются парами malloc free new delete
?
Массивы указателей
double *p[20]; массив, каждым элементом которого является указатель на переменную типа double
Формирование массивов указателей - элементы (переменные) - обычные (статическими) переменные, создаваемые транслятором, или динамические переменные, создаваемыми в процессе работы программы; ► -указатели (связи между элементами) могут быть либо инициализированы (установка начальных значений при трансляции), так и назначены в процессе выполнения программы. ►
Вариант 1 Формирование структуры данных при трансляции: переменные определяются статически, а указатели инициализируются.
Вариант 2. Переменные определяются статически, указатели устанавливаются программно.
Вариант 3. Указуемые переменные создаются динамически, массив указателей статически:
Вариант 4. Все переменные, в том числе и массив указателей, создаются динамически.
Работа с массивом указателей массив Массив указателей Элемент
операции извлечения из обычного массива
операции извлечения из массива указателей
сортировка
конструкции: -pd[i] -i-й указатель в массиве; -*pd[i] -значение указуемой переменной по i-му указателю в массиве.
Многоуровневые указатели
интерпритация double ► переменная, **pp; при косвенном обращении к которой получается указатель на переменную типа double, ► как указатель на указатель ► или адрес указателя
double **pp; 4 варианта структур данных ► -указатель на одиночный указатель на переменную типа double; ► -указатель на одиночный указатель на массив переменных типа double; ► -указатель на массив, содержащий указатели на одиночные переменные типа double; ► -указатель на массив, содержащий указатели на массивы переменных типа double.
double* и double** и указатель-переменная double[] double *[] может ссылаться и на динамический массив указателей, который создается во время работы программы под заданную размерность и указатель-константа статическая структура данных, размерность которой определяется при трансляции
Динамические массивы указателей переменной размерности ► ВИРТУАЛЬНЫМ ► коллекцией МАССИВОМ
// Текущее количество указателей
Динамические матрицы
**matr[1] *matr[2] *matr[3] . . *matr[n]
Многоуровневые массивы указателей типы char*[] и char** char **pp[20]; char ***ppp;
Дуализм двумерного массива и массива указателей операции над массивом указателей на строки: char *p[20]; p[i]++ *(p[i] + j) p[i][j]
char *q, A[20][80]; q q = A; *(q + i*80 + j) // или q[i*80 + j]
oap_12_13(динамические переменные).ppt