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



Указатели и массивы тесно связаны друг с другом. Прежде чем рассмотреть эту связь подробно, заметим, что если uk- некоторый указатель, то uk++увеличивает его значение и он теперь указывает на следющий, соседний адресуемый объект. Значение ukиспользуется в выражении, а затем увеличивается. Аналогично определяются операции uk--, ++uk, --uk.В общем случае указатель ukможно скаладывать с целым числом i.Оператор uk+=iпередвигает ссылку на iэлементов относительно текущего значения. Эти конструкции подчиняются правилам адресной арифметики. А теперь вернемся к массивам. Пусть имеется описание int a[5];Оно определяет массив размером 5 элементов, т.е. пять последовательно расположенных ячеек памяти a[0], a[1], a[2], a[3], a[4].Адресс i-го элемента массива равен сумме адреса начального елемента массива и смещения этого элемента на iединиц от начала массива. Это достигается индексированием: a[i]-i-й элемент массива. Но доступ к любому элементу массива может быть выполнен и с помощью указателей, причем, более эффективно. Если uk -указатель на целое, описанный как int *uk, то ukпосле выполнения операции uk=&a[0]содержит адресс a[0],а uk+iуказывает на i -й элемент массива. Таким образом, uk+iявляется адрессом a[i]*(uk=1)- содержимым i- гоэлемента(операции *и & более приоритетны, чем арифметические операции). Так как имя массива в программе отождествляется с адресом его первого элемента, то выражение uk=&a[0]эквивалентно такому: uk=a.Поэтому значениеa[i]можно записать как *(a+i).Применив к этим двум элементам операцию взятия адреса, получим, что &a[i]и a+iидеитичны.

 

Работа с динамической памятью.

Динамический массив – это массив с переменным размером, т.е. количество элементов может изменяться во время выполнения программы. Динамические массивы дают возможность более гибкой работы с данными, так как позволяют не прогнозировать хранимые объемы данных, а регулировать размер массива в соответствии с реально необходимыми объемами.

Пример: float *array1;

array1=(float*)malloc(10*sizeof(float)) // выделение 10 блоков по sizeof(float) байт каждый. 

Динамическое распределение означает, что программа выделяет память для данных во время своего выполнения. Память для глобальных переменных выделяется во время компиляции, а для нестатических локальных переменных - в стеке. Во время выполнения программы ни глобальным, ни локальным переменным не может быть выделена дополнительная память.

Память, выделяемая в С функциями динамического распределения данных, находится в т.н. динамически распределяемой области памяти. Динамически распределяемая область памяти – это свободная область памяти, не используемая программой, операционной системой или другими программами. Размер динамически распределяемой области памяти заранее неизвестен, но как правило в ней достаточно памяти для размещения данных программы. Большинство компиляторов поддерживают библиотечных функции, позволяющие получить текущий размер динамически распределяемой области памяти, однако эти функции не определены в Стандарте С. Хотя размер динамически распределяемой области памяти очень большой, все же она конечна и может быть исчерпана.

Основу системы динамического распределения в С составляют функции malloc() и free(). Эти функции работают совместно. Функция malloc() выделяет память, а free() – освобождает ее. Это значит, что при каждом запросе функция malloc() выделяет требуемый участок свободной памяти, а free() освобождает его, то есть возвращает системе. В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.ru>.

Прототип функции malloc() следующий:

void *malloc(size_t количество_байтов);

Здесь количество байтов – размер памяти, необходимой для размещения данных. При успешном выполнении malloc() возвращает указатель на первый байт непрерывного участка памяти, выделенного в динамически распределяемой области памяти. Если в динамически распределяемой области памяти недостаточно свободной памяти для выполнения запроса, то память не выделяется и malloc() возвращает нуль. 

 


Дата добавления: 2018-08-06; просмотров: 302; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!