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;

}


 

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

35186. Реформы Александра II и отмена крепостного права 68 KB
  Происходит заметное оживление либерально-оппозиционного движения среди тех слоев дворянства, которые считали необходимым не только отменить крепостное право, но и создать общесословные выборные органы управления, учредить гласный суд, ввести гласность вообще, провести преобразования в сфере просвещения и т. д.
35187. СССР в период «перестройки» (1985-1991 гг.) 81.5 KB
  Архангельске Контрольная работа по дисциплине: История отечества На тему: СССР в период перестройки 19851991 гг. в России как и в целом СССР стали происходить серьёзные изменения. СССР в период перестройки В марте 1985 года после смерти К. Руководство взяло курс на активизацию внутренний и внешний политики СССР на восстановление и укрепление авторитета партии и государственной власти внутри общества и на международной арене.
35188. Культура Киевской Руси 117 KB
  Материальная и духовная культура. Культура Киевской Руси. Смысл и назначение культуры и культурологии Слово культура является одним из наиболее употребляемых оно знакомо каждому из нас но мало кто возьмется объяснять что такое культура с теоретической и научной точки зрения. У большинства людей культура ассоциируется с воспитанностью образованностью интеллигентностью.
35189. Зарождение культуры на Руси 126 KB
  Культура Руси складывается в те же века что и зарождение государства. Особенность Руси в том что она складывалась и развивалась на достаточно большой территории где жили различные племена: поляне северяне радимичи и мног. В связи с этим славянская культура имеет свои региональные черты одни для Поднепровья другие для Северо Восточной Руси и т.
35190. Буржуазные революции 103.5 KB
  На тему Буржуазные революции. Степень активности таких масс в революции их напор обеспечивали большой или меньший успех революции их результаты и характер ликвидации феодализма и его остатков. Буржуазные революции в Испании Португалии и Италии были вызваны притязаниями буржуазии на власть и ее борьбой против абсолютизма восстановленного после краха наполеоновской империи. Хотя обстановка в этих странах в годы Реставрации существенно различалась в Италии антифеодальные преобразования революционного и наполеоновского периода в основном...
35191. Население и трудовые ресурсы мира 150 KB
  4 Распределение природных мировых ресурсов между странами.4 Роль природных ресурсов в мировой экономике.18 Введение Современный этап развития мирового хозяйства отличается всевозрастающими масштабами потребления природных ресурсов резким усложнением процесса взаимодействия природы и общества идентификацией и расширением сферы проявления специфических природноантропогенных процессов возникающих вследствие техногенного воздействия на природу. ПРИРОДНЫЕ РЕСУРСЫ МИРОВОГО ХОЗЯЙСТВА Распределение природных мировых ресурсов между...
35192. Экономические идеи марксизма 97.5 KB
  Потребительская стоимость это полезность товаpа его способность удолетворять ту или иную потpебность человека или обмениваться на другие. Каждая потpебительная стоимость является следствием конкpетного тpуда. Меновая стоимость является следствием абстpактного тpуда затpаты тpуда не зависящие от фоpмы человеческий тpуд вообще.
35193. Правовая сфера жизни общества 81.5 KB
  Сущность права: традиционный и либеральный подходы.Взаимоотношение права и политической власти. Сущность права: традиционный и либеральный подходы. Наиболее распространённым является определение права как системы общеобязательных форм правил поведения установленных или санкционированных государством и обеспеченных его принудительной силой.
35194. Государственное регулирование занятости 75.5 KB
  Рынок труда и его структура 5 2. Государственное регулирование занятости 14 Заключение 17 КТЗ 29 Список использованной литературы 20 Введение Рынок труда имеет ряд особенностей. Эти особенности оказывают существенное влияние на интересы мотивацию степень трудовой активности людей и отражаются на состоянии рынка труда. Принципиальное отличие труда от всех других видов производственных ресурсов в том что он является формой жизнедеятельности человека реализации его...