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

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

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






 

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

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

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; просмотров: 368. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

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

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

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

Философские школы эпохи эллинизма (неоплатонизм, эпикуреизм, стоицизм, скептицизм). Эпоха эллинизма со времени походов Александра Македонского, в результате которых была образована гигантская империя от Индии на востоке до Греции и Македонии на западе...

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

Тема: Кинематика поступательного и вращательного движения. 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью, проекция которой изменяется со временем 1. Твердое тело начинает вращаться вокруг оси Z с угловой скоростью...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

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