Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Вопрос № 66. Динамическое размещение данных в программировании.






Память в работающей программе с точки зрения времени ее выделения может распределяться:

1) статически (секция данных, стэк) – память распределяется в момент компиляции. (пример: int x[10];)

2)динамически – для дин.размещения памяти выделяется спец. Область памяти КУЧА. Объем динамически размещаемых данных опр-ся лишь в момент выполнения программы. Для работы с дин.памятью исп-ся спец.библиотечные ф-ии, расположенные в заголовочном файле #include < alloc.h>.

 

В Си существуют 2 способа доступа к переменной: ссылка на переменную по имени и использование механизма указателей.

Ук.-переменная-это переменная, предназначенная для хранения адреса в памяти.

Ук.-константа – это значение адреса оперативной памяти.

Синтаксис:

[< имя типа> ] * < имя переменной>

*-операция косвенной адресации - операция разыменования указателя - Это операция обращения к содержимому памяти по адресу, к-ый хранится в переменной-указателе. Операнд – указатель. Результат – тот объект, который адресует указатель – операнд.

Значением выражения *р будет число, которое хранится по адресу р.

& - операция взятия адреса применима только к объектам, размещенным в памяти и имеющим имя. Ее нельзя применить к выражениям, константам. Значение – адрес того объекта, к которому операция применяется.

Int date = 1974; //Объявлена пер-я с инициализацией

Int *p = & date; // Объявлен указатель на тип int, к-ый инициализирован адресом пер-ой date

= - операция присваивания. Можно присваивать только значения указателей одинаковых типов.

Int i, *p1, *p2=& i;

Float s, *p3;

P1=p2; //Ук.р1 получил значение указателя р2, т.е.стал равен адресу переменной i

P3=p1; //нельзя

Операции адресной арифметики. К ук.применимы орерации суммирования, вычитания, инкремента и декремента. Имеется ограничение на использование операции суммирования: нельзя складывать две переменные-указатели. Можно прибавить к указателю целую величину.(р+1). При этом важной особенностью адресной арифметики является то, что вычисляемое значение зависит от типа указателя, т.е.от размера того объекта, на который указатель ссылается. Пример:

Long b, *p3, *p4=& b; p3=p4+2; //если р4=0А01, то р3=0А09, если длина типа – 4 байта.

Операцию вычитание можно применять не только к ук.и целой величине, но к двум указателям на объекты одного типа. Разность между ук.также зависит оттипа ук. Значение разности м/у ук.имеет тип int. Это значение вычисляется в единицах, кратных длине отдельного элемента данных того типа, к которому отнесен указатель. Пример:

Int x[5]; int *I, k, j; i= & x[o]; k= & x[5]; j=k-I; // j =4.

Разрешается сравнивать указатели одного типа.

Связь массивов с указателями.

Имя массива является ук.-констаной, равной адресу начала массива. Это позволяет осуществить другой способ доступа к элементам массива – с помощью механизма указателей. Используя операцию косвенной адресации (*), можно получить доступ любому элементу массива.

Int a[5]; a[2]~*(a+2) a тождественно & a[0]

a[i]~a(a+i) a+i тождественно & a[i]

Указатель это пер-я, которая сама хранится в памяти, как и любая другая переменная, занимая либо 2, либо 4 байта.-> указатель на указатель: int **p;

Пер-я р, предназначена для хранения адреса такого байта памяти, в кот-ом, хранится адрес другого байта, содержащего целое число.

Имя двумерного массива является указателем-констант на массив указателей-констант. Элементами такого массива являются указатели-константы на начало каждой иэ строк двумерного массива. Пример: int [3] [3] указателями-константами на нулевую, 1, 2 строки будут m[0], m[1], m[2], следующие выражения будут тождественными:

m[0] и & m[0] [0]

m[2] и & m[2] [0]

m и & m[0]

m+2 и & m[2]

Под динамической памятью понимается память, отличная от памяти, выделенной для кода функции, статических данных и не находящуюся в данный момент под управлением средств организации стека программы. Управление дин-ой памятью полностью берет на себя программист. Почти серьезная программа использует динамическую память. Это объясняется двумя обстоятельствами: во-первых, только при использовании динамической памяти возможно экономное и достаточно эффективное распределение ограниченных ресурсов памяти ЭВМ, во-вторых, поведение дин-их объектов полностью определяется программистом.

Размер кучи(дин-ая память) и ее физ-ое расположение зависит от особенностей операционной системы. С помощью указателей и средств для дин-го выделения памяти можно организовать формирование массивов с переменными размерами динамических массивов.

Void* malloc (unsigned s); - выделяет память. Функция возвращает указатель на начало области дин-ой памяти длиной в s байт. В куче выделяется запрошенное число байт. Для универсальности тип возвращаемого функцией значения есть void*. Указатель такого типа перед использованием надо преобразовать к указателю другого типа спомощью операции явного приведения.

Int * x; x=(int*)malloc(1024);

Void* calloc (unsigned n, unsigned m); - выделяет память и инициализирует ее нулевыми значениями. Ф-я возвращает ук.на начало области обнуленной дин-ой памяти для размещения n элементов по m байт каждый.

Void* realloc (void* bl, unsigned new-bl); - распределяет память. Ф-я изменяет размер блока ранее выделенной дин-ой памяти до размера new-bl байт. Bl – адрес начала изменяемого блока.

Void free (void* bl); - освобождает ранее выделенный участок памяти. Bl – первого байта освобождаемого блока памяти. Ф-я не имеет возвращаемого значения.







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.