Студопедия — Динамические переменные и массивы
Студопедия Главная Случайная страница Обратная связь

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

Динамические переменные и массивы






 

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

Для динамических переменных характерны следующие особенности:

1) у них нет имен, поэтому вся работа с ними осуществляется только с помощью указателя;

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

3) поскольку размер динамической памяти ограничен, то запрос на выделение памяти не всегда удовлетворяется и программист обязан за этим следить.

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

Пример создания и работы с динамической переменной:

 

double *Ptr; // объявление указателя

 

Ptr = new double; // выделение памяти и инициализация указателя

 

if (Ptr == NULL) // если память не выделена

{

printf(“\n Ошибка выделения памяти!”);

getch();

return; // выход из функции, которая

} // использует динамическую память

 

*Ptr = 1.23456; // работа с динамической переменной

 

По окончании работы с динамической переменной она должна быть удалена с помощью операции delete.

delete Ptr; // освободить память, адрес которой хранится в указателе Ptr

Удаление динамической переменной не означает, что память очищается, это означает только то, что ранее занятая память становится доступной для повторного выделения.

В операторе new можно использовать как стандартные типы, так и типы данных, определенные пользователем. Динамически выделять память для переменных стандартных типов невыгодно, т.к. память расходуется не только на переменные, но и на информацию о выделении памяти. Поэтому она выделяется только на большие массивы стандартных или пользовательских типов, размер которых заранее неизвестен.

Динамический одномерный массив создается следующим образом:

 

double *Ptr; // объявление указателя

int N;

 

printf(“\n Введите размер массива ”);

scanf(“%d”, &N);

 

Ptr = new double [N]; // создание динамического массива

 

if (Ptr == NULL)

{

printf(“\n Ошибка выделения памяти!”);

getch();

return;

}

 

for (int i = 0; i < N; i++)

Ptr[ i ] = i * 5; // работа с динамическим массивом

 

Для удаления динамического массива необходимо записать:

 

delete [ ] Ptr;

 

однако, возможен и такой вариант удаления:

 

delete Ptr;

 

т.к. информация о размере выделенной памяти известна.

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

 

Динамический массив Значение выражения Обычный массив
Ptr адрес первого элемента массива &Mas[0]
*Ptr значение первого элемента массива Mas[0]
Ptr+i адрес i -го элемента массива &Mas[i]
*(Ptr+i) значение i -го элемента массива Mas[i]
&(Ptr[i]) адрес i -го элемента массива &Mas[i]
Ptr[i] значение i -го элемента массива Mas[i]

 

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

 

 

Пример создания и обработки динамической матрицы:

 

double **Ptr; // объявление указателя на указатель

int N, M; // объявление размерности матрицы

 

printf(“\n Введите число строк ”);

scanf(“%d”, &N);

printf(“\n Введите число столбцов ”);

scanf(“%d”, &M);

 

Ptr = new double* [N]; // создание динамического массива указателей

for (int i = 0; i < N; i++)

Ptr[ i ] = new double [M]; // создание динамической матрицы (по строкам)

// и инициализация указателей на каждую строку

 

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

 

Динамическая матрица Значение выражения Обычная матрица
*(Ptr+i) значение i -го элемента массива указателей (адрес i -й строки матрицы) Mas[i]
Ptr[i] значение i -го элемента массива указателей (адрес i -й строки матрицы) Mas[i]
*(Ptr+i) + j адрес элемента матрицы в i -й строке i -м столбце &Mas[i][j]
*(*(Ptr+i) + j) значение элемента матрицы в i -й строке i -м столбце Mas[i][j]
&(Ptr[i][j]) адрес элемента матрицы в i -й строке i -м столбце &(Mas[i][j])
Ptr[i][j] значение элемента матрицы в i -й строке i -м столбце Mas[i][j]

 

Удаление динамической матрицы выполняется в порядке, противоположном порядку ее создания. Сначала нужно удалить саму матрицу, а затем массив указателей. Желательно также после этого инициализировать указатель Ptr нулем, чтобы он никуда не указывал. Тогда случайная попытка работы с ним не вызовет проблем.

 

for (int i = 0; i < N; i++)

delete Ptr[ i ]; // удаление динамической матрицы (по строкам)

 

delete [ ] Ptr; // delete Ptr; удаление динамического массива указателей

Ptr = NULL; // обнуление указателя (он никуда не указывает)

 







Дата добавления: 2015-08-12; просмотров: 359. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Различия в философии античности, средневековья и Возрождения ♦Венцом античной философии было: Единое Благо, Мировой Ум, Мировая Душа, Космос...

Характерные черты немецкой классической философии 1. Особое понимание роли философии в истории человечества, в развитии мировой культуры. Классические немецкие философы полагали, что философия призвана быть критической совестью культуры, «душой» культуры. 2. Исследовались не только человеческая...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит...

Оценка качества Анализ документации. Имеющийся рецепт, паспорт письменного контроля и номер лекарственной формы соответствуют друг другу. Ингредиенты совместимы, расчеты сделаны верно, паспорт письменного контроля выписан верно. Правильность упаковки и оформления....

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

Типология суицида. Феномен суицида (самоубийство или попытка самоубийства) чаще всего связывается с представлением о психологическом кризисе личности...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия