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;

}


 

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

74058. Классификация дисперсных систем. Понятие о дисперсной фазе и дисперсной среде 37.77 KB
  Дисперсная система это образования из двух или более числа фаз тел которые совершенно или практически не смешиваются и не реагируют друг с другом химически. Первое из веществ дисперсная фаза мелко распределено во втором дисперсионная среда. К дисперсным системам относят также случай твёрдой дисперсной среды в которой находится дисперсная фаза. Дисперсная фаза далее Д совокупность мелких однородных твердых частиц капелек жидкости или пузырьков газа равномерно распределенных в окружающей дисперсионной среде.
74059. Виды выражений концентраций растворов 14.71 KB
  Наиболее часто используют массовую долю растворённого вещества молярную и нормальную концентрацию. Массовая доля растворённого вещества wB это безразмерная величина равная отношению массы растворённого вещества к общей массе раствора...
74060. Изохорная и изобарная теплота процесса. Закон Гесса 14.22 KB
  При изохорном процессе V=const изменение объема dV=0 поэтому работа газа = 0. При изобарном процессе p=const изменяется температура газа и изменяется объем газа поэтому изменение внутренней энергии газа и работы не равно нулю. Q = dU Подведенное количество теплоты при изобарном процессе расходуется на изменение внутренней энергии и совершение работы над внешними телами. Иными словами количество теплоты выделяющееся или поглощающееся при какомлибо процессе всегда одно и то же независимо от того протекает ли данное химическое...
74061. Основы химической кинетики. Кинетика гомогенных процессов, закон действия масс 23.06 KB
  Скорость химической реакции – изменение концентрации одного из участвующих в реакции веществ. При увеличении температуры на каждые 10 градусов скорость реакции увеличивается в 24 раза закон ВантГоффа. Также скорость реакции увеличивается с повышением концентрации вещества. Кинетика гомогенных процессов: В гомогенном химическом процессе все реагирующие вещества и продукты реакции находятся в одной фазе где протекает реакция.
74063. Основные положения качественного и количественного анализа 15.48 KB
  Цель аналитической химии установление качественного и количественного состава вещества или смеси веществ. Задачей качественного анализа является выяснение качественного состава вещества т е. В зависимости от задания аналитическая химия подразделяется на качественный анализ нацеленный на определение того что или какие вещества в какой форме находится в образце и количественный анализ нацеленный на определение того сколько данного вещества находится в образце. Для определения качественного состава какоголибо вещества необходимо...
74064. Количественные методы исследования химического состава соединений и продуктов 13.94 KB
  Количественный химический анализ имеет целью определение относительного количества отдельных составных частей какоголибо химического соединения или смеси. Применяемые в нём методы находятся в зависимости от качеств состава вещества и потому количественному химическому анализу должен предшествовать всегда качественный химический анализ. Для производства количественного анализа можно применять два различных метода: весовой и объемный. При объёмном анализе измеряются объёмы титрованных содержащих определенное количество реактива растворов...
74065. Аналитические группы катионов 15.03 KB
  К I аналитической группе относятся катионы щелочных металлов калия K натрия N лития Li и катион аммония NH4. Вследствие этого катионы данной группы не имеют группового реагента и открывают их только с помощью частных реакций. Перед проведением частных реакций на катионы I аналитической группы ионы других групп удаляют методом осаждения например в виде карбонатов в нейтральной или щелочной среде. Ко II аналитической группе относятся катионы дающие малорастворимые соединения при взаимодействии с соляной кислотой и ее солями.
74066. Государственно-правовое развитие Англии в Новейшее время 121 KB
  Эволюция государства и права в новейшее время. Основные тенденции развития государства и права в ХХ веке. Новейший период в истории государства и права связан с серьезными изменениями в политической системе многих стран обусловленными глубокими социально-экономическими причинами. Основное назначение современного права состоит в том чтобы сохраняя основные устои общества трансформировать его приспособить к новым общественным потребностям.