
- •1. Клас пам'яті, час існування та видимість об'єкта
- •8. Стек і функції (обробка рекурсивних викликів).
- •11. Поняття показника.
- •12.Операція непрямого звернення до показників, розіменування.
- •13. Особливості роботи з порожніми показниками (типу void).
- •16. Поняття витоку пам’яті при роботі з показниками.
16. Поняття витоку пам’яті при роботі з показниками.
Принцип динамічної організації памяті полягає у тому, що для змінних надається пам'ять за необхідністю. Далі ці змінні опрацьовуються і в потрібний момент пам'ять вивільнюють (за вказівкою програміста). Такі змінні називаються динамічними. Для роботи з динамічними змінними використовують вказівники.При виділенні динамічної памяті застосовується команд а new так: <тип вказівника>*<назва> = new <тип змінної>;
Дія команди new .Для відповідного типу змінонної автоматично надається необхідна неперервна ділянка памяті . Команда new повертає обсяг цієї ділянки, а вказує на її початок. Наприклад щоб зарезервувати у пам'яті комп’ютера область для зберігання значення цілого типу, застосовують таку команду: int *ptr = new int;
Надати ділянку памяті й відразу занести у неї значення можна так: int * ptr2 = new float(3.14);
У адресу, на яку показує ptr2 ,буде занесено число 3.14. З динамічною змінною можна виконувати операції , визначені для даних відповідного базового типу. Після опрацювання динамічних змінних пам'ять необхідно вивільнити, а відповідний вказівник занулити. Якщо цього не зробити, то пам'ять може вичерпати, цю проблему називають витоком памяті . Вивільнюють пам'ять за допомогою команди: <назва вказівника>= NULL; Значенням (адресою) такого вказівника буде нульова адреса 0х00000000. Тут не може бути розміщене значення жодного даного. Приклад:
#include <iostream.h>
void main()
{
int *c1 =new int; // Готуємо пам'ять для цілого числа
*c1 = 5; //Змінна *c1 набуває значення 5
int *c2 =new int(7); //Виділяється пам'ять для c2 і *c2 набуває значення 7
cout<< *c1<<”\t” << “c2”<<”\n”; //Виводимо 5 та 7
//Переадресація – с1вказуватимо на ту саму
c1=c2; // ділянку памяті, що і с2
cout<<*c1<<”\t”<<*c2<<”\n”; // Виводимо 7 та 7
delete(c2); //Пам'ять надану для с2,вивільнюємо
cout<<*c1<<”n\”; //Виводимо 7
}
17. Показник може посилатися на інший показник. Це добувається відповідним заданням числа * при об`яві, що вказує на порядок і щоб отримати це значення такий показник повинен бути розіменованим відповідне число раз: ... int **pptrInt;
... char ***ppSymbol (показник на показник,який сам є показником) ... ----- ... charmychar; char *pSymbol=&mychar;
char **pptr=&pSymbol; char ***ppptr=&pptr; ... ***ppptr=7; ...
18.показники на функції. Ім`я функції само по собі є константним показником, тобто містить адресу входу до неї. Однак можна створити власнийпоказник на функцію. тип (*ім`я_показника_на_функцію) (список_типу_аргументів)
bool (*myfunkPtr) (char, long) Ця об`ява показника на функцію має логічнезначення і приймає в якості параметрів символ і довге ціле. При зверненні достатньо вказувати ім`я показника функції; ... boolbVar; charSymbol=`X`; long bNum=15; bVar=myfunkptr;
19. Посилки в мові с++. Посилка - це особливий тип даних, що є схованою формою показника, який при використанні автоматично розіменовується. Вона може використовуватися, як псевдонім об`єкта. Приклад
тип &ім`я_посилки=ім`я_змінної;
... char letter=`A`; char &ref=letter; int i=0; int &ref=i; ref+=10 //i+=10; ... Обмеження посилок:
1)Посилку не можна перевизначати. 2)Посилки не можна вказувати на нульовий об`єкт.