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

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

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






 

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

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

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



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

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

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

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

СПИД: морально-этические проблемы Среди тысяч заболеваний совершенно особое, даже исключительное, место занимает ВИЧ-инфекция...

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

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

Тема 5. Анализ количественного и качественного состава персонала Персонал является одним из важнейших факторов в организации. Его состояние и эффективное использование прямо влияет на конечные результаты хозяйственной деятельности организации.

Билет №7 (1 вопрос) Язык как средство общения и форма существования национальной культуры. Русский литературный язык как нормированная и обработанная форма общенародного языка Важнейшая функция языка - коммуникативная функция, т.е. функция общения Язык представлен в двух своих разновидностях...

Патристика и схоластика как этап в средневековой философии Основной задачей теологии является толкование Священного писания, доказательство существования Бога и формулировка догматов Церкви...

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