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.


 

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

32383. Психология как наука 14.95 KB
  Все так называемые движения души: эмоции чувства мышление мотивы и другие процессы возможно зафиксировать лишь через их внешние проявления. Индивидуальные психологические явления Индивидуальные психические процессы: познавательные процессы ощущения восприятие внимание память воображение мышление; эмоциональные процессы чувственный тон эмоции аффекты чувства настроение эмоциональный стресс; волевые процессы воля принятие решений преодоление трудностей борьба мотивов управление своим поведением.
32384. Ощущения 13.15 KB
  Каждое из этих свойств отражается разными органами чувств по сути – это разные виды ощущений Психический образ каждого из этих свойств первоначально возникает в разных отделах мозга. Свойства ощущений: Качество – это качественная характеристика ощущений позволяющая отличать одни ощущения от других и осознавать их своеобразие в пределах одного вида. Качество ощущений очень тесно связано с их модальностью. Интенсивность – это количественная характеристика ощущений зависящая от силы действующего раздражителя и от функционального состояния...
32385. Развитие психики в филогенезе. Основные этапы развития поведения и психики животных 13.93 KB
  Основные этапы развития поведения и психики животных. Развитие психики в филогенезе качественное изменения психики происходящее в рамках эволюционного развития живых существ обусловлены осложнением их взаимодействия с окружающей средой. Происхождение психики: Раздражимость – избирательная реакция на воздействие внешней среды.
32386. Восприятие 14.1 KB
  Различие процессов восприятия и ощущения заканчиваются в том что ощущение – это отражение отдельных свойств предметов и явлений а восприятие – целостное отражение предметов в единстве и во взаимосвязи их свойств. Свойства восприятия Предметность – это способность отражать предметы и явления реального мира в соответствии с их функциональным значением. Она тесно связана с целостностью восприятия. В результате их взаимодействия и достраивания посредством памяти и мышления приобретает структурную целостность это не сумма ощущений это...
32387. Естественн-научные основы психологии. Физиологические механизмы психики 14.55 KB
  Физиологические механизмы психики. Изучая отдельные факты психической жизни человека выявляется закономерности их развития раскрываются механизмы лежащие в основе. 4 этап психологии наука изучает факты закономерности механизмы психики. Физиологические механизмы психики.
32388. Внимание 15.34 KB
  Успешность освоения систематизированных знаний и выполнение той или иной деятельности зависит в значительной степени от уровня развития и индивидуальных особенностей внимания человека. Наличие внимания является обязательным условием обеспечивающим успешность протекания каждого психического процесса. В качестве обоснования этой точки зрения указывается на то что в мозге человека можно обнаружить и выделить особого рода нервные структуры связанные именно с процессом внимания. Функции внимания: Отбор значимых воздействий которые...
32389. Содержание, задачи, функции, методы, основные направления и этические принципы работы практического психолога в системе образования 13.8 KB
  Осуществление работы по направлениям личности. Методы работы: Индивидуальная форма работы для детей – игра и рисунок. Групповая форма работы для детей – ролевые игры и психодрама.
32390. Общие представления о мышлении 16.24 KB
  Физиологические основы мышления выявить и исследовать достаточно трудно это объяснятся той специфической ролью которую мышление играет в психологической деятельности человека. Следовательно для функционирования мышления необходимы отделы коры головного мозга отвечающие за познавательные процессы. Установлено также что особую значимую роль для процессов мышления играет лобная доля и речевые центры коры головного мозга. Функции мышления: Понимание решение проблемы и задачи целеобразование рефлексия – деятельность человеческого...
32391. Особенности развития личности ребенка на различных возрастных этапах 14.83 KB
  Внутри этого вида деятельности формируется новая ведущая деятельность характерная для следующего этапа возрастного развития. ведущая деятельность способствует появлению характерных только для этого возраста качественных особенностей. Ведущая деятельность: непосредственно эмоциональное общение внутри и на фоне которой формируются ориентировочные и сенсомоторные манипулятивные действия т. Ведущая деятельность: предметноманипулятивная в процессе которой ребенок овладевает общественными выработанными способами действий с предметами в...