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;

}


 

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

34476. Русское искусство 17в.: Живопись С. Ушакова. Деятельность оружейной палаты. Фресковая живопись. Парсуна 17.72 KB
  Тяга к наукам интерес в литературе к реальным сюжетам рост светской публицистики нарушение иконографических канонов в живописи сближение культового и гражданского зодчества любовь к декору к полихромии в архитектуре да и во всех изобразительных искусствах все это говорит о быстром процессе обмирщения культуры XVII в. Во главе нового движения провозглашающего те задачи живописи которые вели по сути к разрыву с древнерусской иконописной традицией стоял царский изограф теоретик искусства Симон Ушаков 16261686 взгляды которого...
34477. Строгоновская и годуновская школа иконописи. Особенности выразительного языка 18.35 KB
  Второе строгановская школа условно названная так потому что некоторые иконы выполнялись по заказу именитых людей Строгановых. Собирали иконы шитье и резьбу так что их домашние молельни стали настоящими музеями. Так они особенно ценили иконы совсем небольшого размера однако включающие не меньше отдельных сцен чем многоаршинный иконостас. Иконы этого типа напоминающие миниатюру или драгоценные эмалевые изделия и принято называть строгановскими даже если они не были написаны в мастерских Строгановых.
34478. Русское искусство первой трети 18в. Эпоха реформ Петра 1. Строительство Петербурга. Петровское барокко. Скульптура К.Б. Растрелли 72 KB
  Петровское барокко. Петровское барокко историкорегиональный стиль архитектуры СанктПетербурга сложившийся при жизни его основателя Петра Великого в первой четверти XVIII в. Стиль петровского барокко впитал в себя множество разнородных элементов и потому не является Барокко в полном значении этого слова. Так же петровскому барокко свойственна двуцветная окраска зданий чаще красная с белым и плоскостная трактовка декора.
34479. Русское искусство первой трети 18в.: формирование живописного портрета. Преображенская серия. Творчество живописцев И.Н. Никитина, А.М. Матвева 32.5 KB
  : формирование живописного портрета. Еще в XVII веке возник прообраз реалистического портрета значительно отличающийся от старого условного иконописания. В портрете XVIII столетия проявился исключительный интерес к человеку. Уже в так называемой Преображенской серии портретов которые долго было принято называть в науке портретами шутов так как они исполнены с лиц участвовавших в таком сатирическом конклаве как Всепьянейший сумасбродный собор всешутейшего князьпапы видно напряженное внимание к человеческому лицу к реалиям быта.
34480. Русское искусство сер.18в.:Елизаветинское барокко. Интерьеры. Архитектура. Деятельность Б.Ф. Растрелли. Тенденции рококо и барокко в интерьерах и мебели 31 KB
  :Елизаветинское барокко. Тенденции рококо и барокко в интерьерах и мебели. делится на два этапа: 30е годы мрачное время правления Анны Иоанновны засилья иноземцев и 4050е годы годы елизаветинского правления некоторого смягчения нравов предыдущего времени роста национального самосознания поощрения всего отечественного время сложения стиля русского барокко знаменующего синтез всех видов искусства. Елизаветинское барокко художественный стиль характерный для времени Елизаветы.
34481. Русское искусство середины 18в.: Живопись – расцвет портрета. Своеобразие творческого метода живописцев И.Я. Вишнякова, И.П. Аргунова, Л.П. Антропова 36 KB
  : Живопись расцвет портрета. В его портретах особенно детских отразился дух русского рокайльного искусства но в них нет бездушности фривольности наружной слащавости и галантности присущих западному рококо. Но лица в портретах пронизаны теплотой и душевностью в них есть особая интимность и непритязательность обаяние и цельность образа. Аргунов первые приобретшие известность портреты соединяют в себе принцип композиции западноевропейского парадного портрета и идущие от парсуны черты застылости живописной сухости плоскостности.
34482. Русское искусство середины 18в.: Архитектура – от барокко к классицизму 31 KB
  : Архитектура от барокко к классицизму. Переход от барокко к классицизму был одним из самых быстрых в смене стилей отечественной архитектуры. Конец 1750х годов еще расцвет барокко. Барокко как самостоятельный стиль в русской архитектуре оформилось в 1730х годах.
34483. Русская архитектура середины 18в. Школа Д. В.Ухтомского. Своеобразие архитектурного почерка 33 KB
  Ухтомского заключалась в руководстве правильной застройкой города. Ухтомского. Ухтомского выходили отличные зодчие примером чего может служить М. Ухтомского.
34484. Русская архитектура второй половины 18в. Деятельность М.Ф. Казакова 35 KB
  Казакова М. Казаков ученик архитектурной школы известного русского зодчего Д. возглавил школу и команду Казаков приобрел большой строительный опыт: участвовал в создании Головинского дворца Триумфальных ворот на Страстной площади в честь коронации Екатерины II галереи Оружейной палаты. Впервые дарование Казакова как архитектора раскрылось во время его участия в восстановлении Твери после пожара в мае 1763 г.