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;

}


 

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

81633. Види текстів за метою мовлення. Складання усного опису калини. Складання текстів за поданим зачином і кінцівкою 355.5 KB
  Виховувати: бережливе ставлення до калини як лікарської рослини оберегу символу України Обладнання: підручники мультимедійна презентація картки калина вишиванки коровай Тип уроку: комбінований Хід уроку I. Так діти це калина. А Карлсон буде у вас вчитися 1 ряд скласти прислівя зі словосполучень...
81634. Подорож у країну імен та прізвищ. (Велика буква в іменах, прізвищах та по-батькові людей) 115 KB
  Мета: формувати в дітей уміння розрізняти поняття «ім’я», «по батькові», «прізвище», учити правильно писати власні іменники, ознайомити з етимологією деяких із них, розвивати дослідницький інтерес, спостережливість, творчість, фантазію, уміння працювати з підручником самостійно, у парах, аналізувати...
81635. Написання суфіксів -ськ-, -зьк-, -цьк- в прикметниках 51 KB
  Задачі: Формування комунікативної автономізаційної компетентностей: виробляти в учнів вміння і навички вживання суфіксів ськ цьк зьк. Сьогодні на уроці ми будемо вчитися правильно вживати та записувати у словах суфікси ськ зьк цьк. З мяким знаком зьк цьк ськ написать не забувай.
81636. Бабусенько ріднесенька 190.5 KB
  Мета: сприяти розвитку навичок виразного читання,слухання та комунікативних умінь; розвивати мовлення, творчу фантазію, збагачувати словниковий запас, уміння висловлювати думку; підкреслити важливу роль бабусі у житті кожної людини, допомогти відчути цінність зв’язку між поколіннями та дитиною...
81637. У гостях у дієслів майбутнього часу. Дієслова майбутнього часу. Змінювання дієслів майбутнього часу за особами і числами 49.5 KB
  Мета: закріпити знання учнів про часові форми дієслів; навчитись утворювати просту і складену форми дієслів майбутнього часу; змінювати дієслова майбутнього часу за особами та числами; вчити працювати творчо; висловлювати свої думки; виховувати любов до рідної матусеньки.
81638. Іменник (узагальнюючий урок) 40 KB
  Мета: узагальнити знання учнів про граматичні ознаки іменника, розвивати вміння робити висновки та узагальнювати вміння аналізувати, розвивати творчі вміння аналізувати, розвивати творчі здібності, усне і писемне мовлення, виховувати старанність, любов до мови.
81639. Україна на планеті Земля 69.5 KB
  Мета: дати учням загальне уявлення про розташування України на карті; формувати пізнавальні комунікативні компетентності творче мислення; розвивати спостережливість уміння порівнювати класифікувати самостійно робити висновки; виховувати любов до своєї Батьківщини ощадливе ставлення до природи.
81640. Дівчатка й хлопчики 32.5 KB
  Хлопчики підходять до дівчаток і роблять їм комплімент потім навпаки. Діти називають риси характеру дівчаток і хлопчиків. Вчитель підводить їх до висновку що у дівчаток і хлопчиків є спільні риси характеру. Сьогодні поговоримо про дівчаток і хлопчиків жінок і чоловіків і про те чим...
81641. Стосунки зі старшими й молодшими. Образливі слова. Дружба 30.5 KB
  Мета. Довести до дітей значення стосунків і звичок для здоров’я людини. Виховувати шанобливе ставлення до людей різного віку. Обладнання. Зошит, підручник, ілюстрації до казок, кола з паперу червоного, зеленого й жовтого кольорів.