4869

Указатели и массивы. Способы распределения памяти. Динамическое распределение памяти. Операции new и delete

Лекция

Информатика, кибернетика и программирование

Указатели и массивы. Способы распределения памяти. Динамическое распределение памяти. Операции new и delete. Динамические массивы. Как уже было сказано ранее, массивы представляют собой последовательно размещенную в памяти последовательность перемен...

Русский

2012-11-28

37.5 KB

19 чел.

Указатели и массивы. Способы распределения памяти. Динамическое распределение памяти. Операции new и delete. Динамические массивы.

Как уже было сказано ранее, массивы представляют собой последовательно размещенную в памяти последовательность переменных одного типа. В С++ имя массива связано с адресом, по которому в памяти находится первый элемент массива, т.е. по сути, является указателем на первый элемент массива. Используя правила адресной арифметики, можно работать с элементами массива без применения оператора индексации []:

int A[5]; // Массив из 5 элементов

 // Адрес A эквивалентен &A[0]

*( A + 2 ) = 10; // эквивалентно A[2] = 10;

 

 // Обход элементов массива с использованием адресной арифметики

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

 *( A + i ) = i;

С++ позволяет работать с несколькими видами памяти.

Глобальная или статическая память выделяется в момент загрузки программы в оперативную память (до вызова функции main), а её размер полностью определяется на этапе компиляции. В статической памяти размещаются переменные, объявленные в глобальном контексте (вне каких-либо блоков), а также статические переменные.

int i = 10;  // Глобальная переменная

double D[10]; // Глобальный массив

int main()

{

    ...

}

Автоматическая память — это специальный регион памяти, резервируемый при запуске программы до вызова функции main из свободной оперативной памяти и используемый в дальнейшем для размещения локальных объектов: объектов, определяемых в теле функций и получаемых функциями через параметры в момент вызова. Автоматическую память часто называют стеком. Управление автоматической памятью осуществляется компилятором – он «автоматически» выделяет память под локальные объекты при их создании и освобождает память при их разрушении.

int main()

{

 double d = 5; // Переменная в автоматической памяти

 int A[5];     // Массив в автоматической памяти

}

Динамическая память – это совокупность блоков памяти, выделяемых из доступной свободной оперативной памяти непосредственно во время выполнения программы под размещение конкретных объектов. Доступную программе свободную память называют кучей (heap). Управление динамической памятью осуществляется явным образом с помощью операторов new (выделение памяти) и delete (освобождение памяти). Обращение к памяти возможно через указатель на соответствующий участок.

double * d = new double(5.5); // Выделение памяти под одиночную

// переменную с одновременной

// инициализацией

 float * f = new float[10];    // Выделение памяти под массив

 delete d;    // Освобождение памяти, занимаемой

   // одиночной переменной

 delete [] f; // Освобождение памяти, занимаемой массивом

Использование динамической памяти становится необходимым в случаях, когда размер нужной памяти слишком велик для размещения в стеке (т.к. размер стека существенно ограничен), либо заранее неизвестен, например, когда в памяти необходимо разместить данные, поступающие из «внешнего» источника (ввод с клавиатуры, из файла, сетевого соединения и т.п.). В качестве примера, иллюстрирующего сказанное, можно рассмотреть задачу сохранения в массив последовательности чисел, вводимых с клавиатуры. Количество чисел заранее неизвестно.

#include <iostream>

int main()

{

 // Начальный размер резервируемой памяти

 const int INITIAL_SIZE = 10;

 // Прирост памяти при переполнении

 const int SIZE_INCREMENT = 10;

 // Выделяем начальное количество памяти

 double * D = new double [ INITIAL_SIZE ];

 // Текущее количество записанных элементов в массиве

 int currentLength = 0;

 // Текущий размер выделенной памяти

 int maxSize = INITIAL_SIZE;    

 // "Рабочая" переменная

 double tmp;

 

 while( std::cin >> tmp )  // Читаем очередное число

{

 // В массиве кончилось место

 if ( currentLength == maxSize )

 {

  // Увеличиваем необходимый размер памяти

  maxSize += SIZE_INCREMENT;

  // Запоминаем указатель на текущую память

  double * oldD = D;

  // Выделяем новую память (большего размера)

  D = new double[ maxSize ];  

  // Копируем содержимое "старой" памяти в "новую"

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

   D[ i ] = oldD[i];

  // Освобождаем "старую" память

  delete [] oldD;

 }

 // Записываем очередной элемент в массив

 D[ currentLength++ ] = tmp;

}

 // Вывод всех элементов массива

 std::cout << "Total elements: " << currentLength << std::endl;

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

 std::cout << D[ i ] << " ";

std::cout << std::endl;

 system( "pause" );

 return 0;

}


 

А также другие работы, которые могут Вас заинтересовать

83954. Актуальный ассортимент и приготовление горячих соусов к блюдам из мяса 2.47 MB
  Провести и разработать ассортимент современных горячих соусов, рассмотреть технологию их приготовления и примеры современной подачи. Задачи: Доказать актуальность выбранной темы; Дать историческую справку о значении соусов в питании; Разработать ассортимент современных горячих соусов...
83955. Анализ качества и эффективности использования персонала ОАО «Сбербанка России» 451.5 KB
  В связи с этим актуальность выбранной темы очевидна. В настоящее время, вопрос оценки качества персонала встает особенно остро, поскольку каждая организация старается максимально оптимизировать свою деятельность, сделать ее более эффективной.
83956. Гигиеническая оценка физического развития и питания пациента 106.5 KB
  Содержание курсовой работы включает следующие разделы: Анамнез образа жизни пациента Исследование и оценка физического состояния пациента Исследование и оценка фактического питания пациента Изучение суточных энергозатрат и определение потребности пациента в основных питательных веществах...
83957. Показатели оценки работы ремонтной службы 77.62 KB
  Современные предприятия оснащены дорогостоящим и разнообразным оборудованием, установками, роботизированными комплексами, транспортными средствами и другими видами основных фондов. В процессе работы из-за износа и разрушения отдельных деталей снижается их производительность, точность и другие параметры.
83958. ФИЛОСОФИЯ В СИСТЕМЕ КУЛЬТУРЫ 34.46 KB
  Философия как мировоззрение. По-этому уже на ранних этапах наряду с религией выработку новых знаний и ориентаций берет на себя светская культура в ее разнообразных проявлениях: искусство и литература философия и наука. Философия мировоззренческая форма сознания.
83959. Кредитные деньги и кредитные орудия 38.02 KB
  Деньги одно из величайших человеческих изобретений. В частности по форме существования деньги бывают наличные и безналичные. Наличные деньги в свою очередь подразделяются на реальные деньги это монеты из драгоценных металлов слитки кредитные деньги банкноты и казначейские билеты и разменные монеты.
83960. НЕСТАЦИОНАРНАЯ ТЕПЛОПРОВОДНОСТЬ 874.45 KB
  В результате вычислений необходимо выполнить следующие задания: Определить число Nu коэффициент теплоотдачи и плотность теплового потока: при свободной конвекции в воде и воздухе; при вынужденной конвекции в воде и воздухе; и плотность теплового потока за счет теплового излучения тела.
83961. ОПИС, ПРИЗНАЧЕННЯ, БУДОВА І ПРИНЦИП ДІЇ ТРИСТУПЕНЕВОГО ЦИЛІНДРИЧНОГО РЕДУКТОРА 182.02 KB
  Редуктор класифікують за такими ознаками: за типом передачі: зубчасті за числом ступенів: триступеневий за типом зубчастих коліс: циліндричні косо зубі прямозубі шевронні за відносним розташуванням валів редуктора в просторі: горизонтальне лінійне за особливостями кінематичної...
83962. Грибы. Слизевики. Особенности строения и деления на таксоны 2.09 MB
  Среди них есть как свободноживущие в почве на разлагающихся растительных остатках и тому подобных субстратах так и паразиты водорослей водных грибов и высших водных и наземных растений. Черты строения гифохитриомикотовых и лабирунтуломикотовых грибов.