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;

}


 

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

21097. Культура України в 40-80-х рр. XX ст 25.78 KB
  Культура України в 4080х рр. Всього за межі України було вивезено понад 40 тис. Брутальній критиці та обвинуваченням у перекрученнях буржуазнонаціоналістичного характеру були піддані роботи істориків України Короткий курс історії України Нарис історії України. Рильського за його доповідь Київ в історії України Річниця Шевченка поетичні твори Київські октави.
21098. Культура незалежної України 23.73 KB
  Культура незалежної України Проголошення незалежності України 24 серпня 1991 р. Верховна Рада України ухвалила Основи законодавства про культуру якими передбачені заходи подальшого розвитку української національної культури. Верховна Рада України провела слухання на тему Культурна політика в Україні: пріоритети принципи та шляхи реалізації. показав що українська мова є рідною для 675 населення України.
21099. Визначення поняття «культура», її структура та основні функції 19.29 KB
  Термін культура вперше зустрічається в одному з творів знаменитого римського оратора Цицерона 45 р. Як самостійна наукова категорія культура фіксується вперше у працях німецького юриста С. У подальшому слово культура отримало ще більш узагальнене значення яке охоплювало собою сукупність створених людськими спільнотами традиційних благ і цінностей.
21100. Перші паростки культури на українських землях у найдавніші часи 17.16 KB
  Перші паростки культури на українських землях у найдавніші часи. Виникнення культури нерозривно повязано з появою людини. Загальні закономірності розвитку культури у первісну добу на українських землях були такими самими як в інших регіонах земної кулі проте були й деякі особливості. З огляду на це питання про генетичні витоки української культури має сьогодні неабияке значення і викликає у своєму розвязанні доволі гострі зумовлені актуальними проблемами в житті нашого суспільства суперечки.
21101. Трипільська культура 18.72 KB
  Трипільська культура. Найбільшого розвитку в цей час в добу енеоліту досягла трипільська культура названа так від с. Потретє за своїм походженням трипільська культура хоч і була повязана з БалканоНижньодунайським регіоном але в процесі поширення на нові східні території включала в себе на різних етапах елементи місцевих неолітичних та енеолітичних культур. Почетверте трипільська культура відзначається розташуванням поселень певними зосередженими групами з проміжними менш заселеними територіями.
21102. Кімерійці, скіфи, сармати, їх культура та світогляд 19.74 KB
  Але історичні відомості про скіфів містяться в іноземних джерелах. Одним із перших про скіфів написав Геродот який присвятив їм окрему книгу своєї Історії і не лише яскраво змалював побут і звичаї тих народів які заселяли українські землі під назвою скіфів а й навів дані про їх релігійні погляди міфологію. У випадку скіфів такою ознакою послужила характерна форма півсферичних посудинчаш характерних для кочівників і більш позаднього часу. Поховання кочівницьких скіфів відрізняються від поховань осідлого населення.
21103. Давньогрецька культура на теренах України 15.24 KB
  Північне Причорноморя входило до сфери колонізації руху греків яких привертали сюди родючі землі велика кількість риби в гирлах річок можливість вести широку торгівлю з племенами північних причорноморських степів скіфами синдами меотами та ін. Античні міста Північного Причорноморя жили самостійним життям зберігаючи проте торгові та культурні звязки зі своїми метрополіями. Велику роль в їх економічному житті відігравала торгівля з містами Греції та Малої Азії а також з племенами причорноморських степів. В містах Північного...
21104. Язичницька культура давніх слов’ян 22.85 KB
  Язичницька культура давніх словян. Релігійні вірування давніх словян давно привертають пильну увагу дослідників. Однак жодну з сучасних реконструкцій світу давньословянських вірувань не можна вважати остаточно доведеною. А подруге кожне словянське племя імовірно визнавало своїх богів культ яких не поширювався на значні території.
21105. Фольклор, музика, побут за часів Київської Русі 18.83 KB
  Фольклор музика побут за часів Київської Русі. Культура часів Київської Русі не була явищем однорідним уніфікованим для всіх регіонів держави яка обіймала великі території від Чорного до Білого морів населені цілком різними племенами. Вельми показовою ілюстрацією розбіжностей у релігійних уявленнях населення різних регіонів Київської Русі може служити поховальний обряд який суттєво відрізнявся навіть у найближчих сусідів що складали етнічне ядро держави у полян та древлян. Протягом тисячолітньої історії християнства на Русі церква...