68978

Вказівники. Функції динамічного розподілу пам’яті

Лекция

Информатика, кибернетика и программирование

Кожна змінна в програмі - це об’єкт, який має ім’я і значення. За ім’ям можна звернутися до змінної і отримати (а потім, наприклад, надрукувати) її значення. Щоб отримати адресу в явному вигляді, в мові Сі застосовують унарну операцію. Вираз Е дозволяє отримати адресу ділянки пам’яті, виділеної на машинному рівні для змінної Е.

Украинкский

2014-11-14

37 KB

3 чел.

Лекція № 5

Тема: Вказівники. Функції динамічного розподілу пам'яті.

План

  1.  Вказівники
  2.  Операції над вказівниками
  3.  Динамічний розподіл пам'яті

Вказівники

Кожна змінна в програмі - це об'єкт, який має ім'я і значення. За ім'ям можна звернутися до змінної і отримати (а потім, наприклад, надрукувати) її значення.

Щоб отримати адресу в явному вигляді, в мові Сі застосовують унарну операцію &. Вираз &Е дозволяє отримати адресу ділянки пам'яті, виділеної на машинному рівні для змінної Е.

Операція & застосовується тільки до об'єктів, що мають ім'я і розміщеним в пам'яті. Її не можна застосовувати до виразів, констант, бітових полів структур, регістрових змінних або зовнішніх об'єктів, з якими може взаємодіяти програма.

Для зберігання, перетворення і передавання адрес в мові Сі введені змінні типу "вказівкник". Вказівник в мові Сі можна визначити як змінну, значенням якої служить адреса об'єкту конкретного типу. Крім того, значенням вказівника може бути явно не рівне ніякій адресі значення, яке приймається за нульову адресу. Для його позначення у ряді заголовочних файлів, наприклад у файлі stdio.h, визначена спеціальна константа NULL.

Як і всякі змінні, вказівники потрібно визначати і описувати, для чого використовується, поперше, роздільник '*'. В описі і визначенні змінних типу "вказівник" необходідно повідомляти, на об'єкт якого типу посилається описуваний вказівник. Тому, окрім роздільника '*', у визначення і описания вказівників входять специфікації типів, задаючі типи об'єктів, на які посилаються вказівники. Приклади визначення вказівників:

char  * z; /*   z  - вказівник  на об'єкт  символьного  типу  */

int  *k,*i; /*  k, i  -  вказівники на  об'єкти цілого  типу  */

float *f; /*  f — вказівник  на  об'єкт речовинного  типу  */

Отже, у визначеннях і описах вказівників застосовується роздільник '*', який є в цьому випадку знаком унарної операції непрямої адресації, інакше званою операцією розіменування або операцією розкриття посилання або звернення за адресою. Результат цієї операції - той об'єкт, який адресує вказівник-операнд.

int E,C,B,*m; /* Визначення змінних і вказівника m: */

m=&Е ; /* Значенню m присвоїти адресу змінної Е: */

*m=В+С; /*  Переслати  значення виразу С+В в ділянку пам'яті з адресою рівною значенню m:   */


Операції над вказівниками

Унарні адресні операції '&' і '*' мають більш високий пріоритет, ніж арифметичні операції.

При використанні адресної операції '* в арифметичних виразах слід остерігатися випадкового поєднання знаків операцій ділення / і розіменування '*', оскільки комбінацію '/*' компілятор сприймає як початок коментаря. Наприклад, вираз а/* і слід замінити таким - а/(*і).

Унарні операції '*' і '++' або '--' мають однаковий пріоритет і при розміщенні поряд виконуються справа наліво. Додавання цілочисельного значення n до вказівника, адресуючому деякий елемент масиву, призводить до того, що вказівник набуває значення адреси того елемента, який відстає від поточного на n позицій (елементів). Якщо довжина элемента масиву рівна d байтів, то чисельне значення вказівника змінюється на (d*n).

До вказівників застосовуються операції порівняння '>', '>=','! =', '==', '<=', '<'. Таким чином, вказівники можна використовувати у відношеннях. Але порівнювати вказівники допустимо тільки з іншими вказівниками того ж типу або з константою NULL, що позначає значення умовної нулевої адреси. Наведемо приклад, в якому використовуються операції над вказівниками і виводяться значення. Для виводу значень вказівників в рядку формату функції printf використовується специфікація перетворення %р.

Динамічний розподіл памяті

Динамічна пам'ять - це пам'ять, яка виділяється в процесі виконання програми. Після виділення динамічної пам'яті вона зберігається до її явного звільнення, це може бути виконано тільки за допомогою спеціальної бібліотечної функції free().

Якщо динамічна пам'ять не була звільнена до закінчення виконання програми, то вона звільняється автоматично при завершенні програми. Проте явне вивільнення непотрібної пам'яті,  є ознакою хорошого стилю програмування. В процесі виконання програми ділянка динамічної пам'яті доступна скрізь, де доступний вказівник, адресуючий цю ділянку. Таким чином, можливі наступні три варіанта роботи з динамічною пам'яттю, яка виділяється в деякому блоці (наприклад, в тілі неголовної функції):

•  вказівник (на ділянку динамічної пам'яті) визначений як локальний об'єкт автоматичної пам'яті. В цьому випадку виділена пам'ять буде неприступна при виході за межі блоку локалізації вказівника, і її потрібно звільнити перед виходом з блоку;

•  вказівник визначений як локальний об'єкт статичної пам'яті. Динамічна пам'ять, виділена однократно в блоці, доступна через вказівник при кожному повторному вході в блок. Пам'ять потрібно звільнити тільки по закінченні її використання;

• вказівник є глобальним об'єктом по відношенню до блоку. Динамічна пам'ять доступна у всіх блоках, де "видний" вказівник. Пам'ять потрібно звільнити тільки після закінчення її використання.

Варіант, коли об'єкт динамічної пам'яті пов'язані із статичним внутрішнім (локалізованим) вказівником:

#include <stdio.h>

#include <alloc.h>  /* Для функцій malloc( ), free( )*/

void dynam(void)

{

static char *uc=NULL; /* Внутрішній вказівник */

/* Захист від багатократного виділення пам'яті: */

if(uc == NULL)

{

uc=(char*)malloc(1);

*uc='A';

}

printf("\t%c",*uc);

(*uc)++;

return;

}

void main( )

{

int i ;

for (i=0; i<5; i++) dynam();

}

Результат виконання програми: А             В             С             D             E

Деяка недбалість попередньої програми - виділення функцією malloc( ) ділянка пам'яті явно не звільняється функцією free().

Для виділення динамічної памяті також використовується функція new, для звільнення – delete.


 

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

21907. Отраслевые геоинформационные проекты 139.5 KB
  Создание карт распределения геологической продукции и информации: а по административным районам; б по геологическим структурам. Создание двумерных и трехмерных моделей подсчета запасов полезных ископаемых и карт в изолиниях. Персональные компьютеры в руках геолога представляют собой надежный инструмент который дает большие возможности как по созданию геологических отчетов геологических карт научных разработок так и по решению различных модельных задач по теории рудообразования геотектонике стратиграфии металлогении и т.
21908. Некоторые вопросы оценки качества цифровых карт 110 KB
  Для быстрой оценки точности цифровой карты необходимо проверить значения реальных координат объектов карты. Проверить значения координат в углах рамки карты. в зависимости от вида и масштаба карты. Если югозападный угол карты имеет неточную привязку то весьма вероятно что все объекты карты будут иметь координаты со сдвигом.
21909. История развития ГИС 77.5 KB
  Одна из наиболее интересных черт раннего развития ГИС особенно в шестидесятые годы заключается в том что первые инициативные проекты и исследования сами были ГЕОГРАФИЧЕСКИ РАСПРЕДЕЛЕНЫ по многим точкам причем эти работы осуществлялись независимо часто без упоминания и даже с игнорированием себе подобных. Возникновение и бурное развитие ГИС было предопределено богатейшим опытом топографического и особенно тематического картографирования успешными попытками автоматизировать картосоставительский процесс а также революционным достижениями...
21910. Классификация ГИС технологий 96.5 KB
  Множество задач решаемых современными ГИС научных прикладных образовательных наконец бытовых не поддается исчислению складываясь из необозримого числа достойных внимания и описания объектов реальности помноженных на разнообразие мотивов и целей человеческой деятельности. При всем многообразии типов ГИС возможна их классификация по нескольким основаниям: пространственному охвату объекту и предметной области информационного моделирования проблемной ориентации функциональным возможностям уровню управления и некоторым другим...
21911. Ввод данных в ГИС. Базовые структуры данных в ГИС. Представление пространственных данных. Структура геоинформационных систем 73 KB
  Базовые структуры данных в ГИС. Представление пространственных данных. Ввод данных в ГИС.
21912. Определение положения точек на поверхности Земли. Координатные данные. Взаимосвязи между координатными моделями. Определение положения точек на поверхности Земли 71 KB
  Определение положения точек на поверхности Земли Координатные данные составляющие один из основных классов геоинформационных данных используют для указания местоположения на земной поверхности Поверхность Земли имеет сложную форму. Эта информация образует класс координатных данных ГИС являющийся обязательной характеристикой геообъектов. Будучи частью классом общей модели данных в ГИС координатные данные определяют класс координатных моделей Основные типы координатных моделей Класс координатных моделей можно разбить на типы. При этом...
21913. Антенны с круговой диаграммой направленности 224 KB
  Наиболее широкое применение в этой группе получили антенны типа Ground Plane GP рис.1 Конструкция антенны GP Штыревая конструкция антенны удобна для размещения как на крыше здания так и на автомобиле.6 Длина элементов антенны GP Диаметр трубки мм 2 6 20 40 Длина штыря l мм 2690 2670 2650 2620 Для нормальной работы антенны она снабжается тремя противовесами которые можно выполнить из трубки или антенного канатика.
21914. Направленные антенны. Полуволновой вибратор 375.5 KB
  Для обеспечения связи между двумя неподвижными станциями расстояние между которыми превышает дальнобойность антенн типа GP с успехом используют направленные антенны Волновой канал рис. Эти антенны концентрируют максимум излучения в нужном направлении обеспечивая выигрыш как при передаче так и при приеме.1 Антенны Волновой канал Описанные здесь антенны при горизонтальном расположении вибратора имеют горизонтальную поляризацию.
21915. Антенные решетки 122.5 KB
  Размещение излучателей в самой решетки может быть эквидистантное у которого шаг расстояние между излучателями величина постоянная и неэквидистантное у которого шаг меняется по определенному закону или случайным образом. По способу возбуждения питания излучателей различают решетки с последовательным и параллельным питанием. В больших антенных решетках применяют комбинации последовательнопараллельного питания излучателей особенно в случае разделения всей антенной решетки на подрешетки модули меньших размеров.