
- •2. Види констант та константні вирази.
- •3. Вирази та операції, пріоритет операцій та порядок обчислення виразів.
- •3. Логічні операції.
- •4. Побітові операції.
- •6. Операції інкременту та декременту.
- •7. Умовна операція (умовний вираз).
- •4. Основні інструкції :
- •5. Адресація; вказівники та динамічні змінні; адресна арифметика; динамічний розподіл пам’яті в мові с.
- •6. Масиви та їх зв’язок з вказівниками; символьні масиви; двовимірні масиви.
- •7. Стандартний форматований ввід та вивід інформації в с.
- •1. Форматований стандартний вивід в с.
- •2. Форматований стандартний ввід в с.
- •9. Функції в мові с:
- •12. Об’єднання.
- •13. Організація файлів та робота з ними в мові с.
- •14. Основні директиви препроцесора, макровизначення та проблема їх використання.
- •15. Загальна структура програми в мові с.
- •16. Аргументи функції main().
- •17. Структура програми мовою с.
- •19. Вбудовані функції.
- •20. Параметри функцій за замовчуванням.
- •21. Змінні типу посилань.
- •22. Операції new та delete.
- •23. Перевантаження функцій.
- •26. Дані-члени та функції-члени класу, вказівник this.
- •27. Статичні члени класу – дані та методи.
- •28. Конструктори та деструктор класу, конструктор копіювання.
- •29. Спадкування: базовий та похідний клас, віртуальні функції, поліморфізм, абстрактний клас.
- •30. Перевантаження операторів.
- •1. Дружні функції.
- •2. Вказівник this.
- •31. Шаблони функцій та класів.
- •1. Шаблони функцій.
- •2. Шаблони класів.
- •32. Файлові потоки; стандартні потоки введення-виведення, форматування.
- •33. Контейнерні типи даних.
5. Адресація; вказівники та динамічні змінні; адресна арифметика; динамічний розподіл пам’яті в мові с.
Вказівник – це змінна, яка може містити адресу деякого іншого об'єкта. Ним може бути в найпростішому випадку інша змінна або масив, структура, функція, клас (в C++) тощо.
Синтаксис визначення вказівника: <тип> * <ідентифікатор_вказівника>;
Приклади: int * р_і; // р_і - вказівник на тип int; char * р_с; // р_с - вказівник на тип char
В цих прикладах вказівники поки що не вказують ні на які об'єкти - вони не проініціалізовані.
В мові С для ініціалізації вказівника можна використати один з двох способів:ініціалізація адресою існуючої змінної або ініціалізація адресою динамічно виділеної пам'яті (з допомогою функції malloc (), calloc ()).
Приклади.
int і; int *р_і = &і; // вказівник р_і вказує на і // унарна операція & - взяття адреси
*р_і = 10; // змінній і присвоєно значення 10
++*р_і; // змінна і збільшена на 1
cout « *р_і; // виводимо значення і
Зауваження. У виразі (*рі)++; дужки обов'язкові на відміну від виразу ++*р_і; із-за порядку виконання операцій.
Адресна арифметика
Для будь-яких вказівників на один тип допустимі перевірки на рівність та нерівність їх між собою та присвоєння, а також присвоєння та порівняння з вказівником null. Якщо р1 та р2 - вказівники и на один і той самий масив, то допустимими операціями з ними додатково є такі:
р1 < р2 перевірка: "р1 вказує на елемент масиву з меншим індексом, ніж той, на який вказує р2";
р1 <= р2 перевірка: "р1 вказує на елемент масиву з індексом не більшим, ніж той, на який вказує р2";
р1 > р2 перевірка: "р1 вказує на елемент масиву з більшиміндексом, ніж той, на який вказує р2";
р1 >= р2 перевірка: "р1 вказує на елемент масиву з індексом не меншим, ніж той, на який вказує р2";
р2 - р1 кількість елементів масиву між елементами, що адресуються р2 та р1;
p1 + k вказівник на k-ий елемент масиву, рахуючи вперед від елементу, що адресується р1.
p1 - k вказівник на k-ий елемент масиву, рахуючи назад від елементу, що адресується р1.
Динамічний розподіл пам'яті.
Динамічним розподілом пам'яті керують функції із файлу <stdiib.h> (<cstdlib> у просторі імен std):
void* malloc (size_t size); - виділяє size байтів пам'яті в області Heap і повертає вказівник на початок цієї області або вказівник null, якщо пам'ять невиділена. pi = (int*) malloc (sizeof(int)); // вказівник на 1 елем.
void* calloc (size_t n, size_t size) ; - повертає вказівник на початок області пам'яті, достатньої для збереження n об'єктів розміру size або вказівник null, якщо пам'ять не виділена. p = (int*) calloc(5, sizeof(int));
void* realloc (void* p, size_t size); - змінює розмір пам'яті, на яку вказує вказівник р, на size та повертає вказівник на нову область, або вказівник null, якщо зміна неможлива. Для частини пам'яті розміру, рівному найменшому із старого та нового значень, зміст не зміниться. p_i = (int*) realloc (p_i, 10*sizeof(int));
void free (void* p); - звільняє область пам'яті, на яку вказує вказівник р. free (p);