
- •1 Основні відомості про вказівники
- •2. Вказівники та посилання
- •Void function_a (char*, int, short*);
- •Int *pi; /* вказівник-змінна на дані типу int */
- •3. Ініціалізація вказівника
- •4. Розіменування та присвоєння
- •5. Void-вказівник
- •6. Операція пересування вказівника
- •7. Використання вказівників з модифікатором const
- •8. Деактивації дії модифікатора
- •9. Подвійний вказівник
- •10. Вказівники і масиви
- •11. Доступ до ділянок динамічної пам'яті
- •12. Звільнення пам'яті
- •8. Операції з вказівниками
- •Int I, *pi; /* pi –змінна-вказівник */
- •13. Динамічні масиви
- •11. Посилання
- •Лабораторный практикум
- •Вопросы без ответов
- •3 Основні операції над вказівниками
- •4 Багаторівнева непряма адресація
- •5 Операції над вказівниками
- •Void main ()
- •Void main()
- •6 Проблеми, пов'язані з вказівниками
- •Int *х; /* змінній-покажчику 'х' виділена оп, але 'х' не містить значення адреси оп для змінної */
- •Int *х; /* х - ім'я покажчика, він одержав оп*/
- •Void main ()
- •9 Масиви
- •1.9.1 Основні поняття
- •Int а[5]; /* оголошення зовнішнього масиву */ main ()
- •9.2 Оголошення та звертання в одновимірних масивах
- •9.3 Оголошення та звертання до багатовимірних масивів
- •Int а[3][4]; /* а - вказівник-константа */
- •10 Масиви покажчиків
- •10.1 Робота з великими масивами
- •Void main()
- •Int *p[200], I, j; clrscr() ;
- •10.2 Вільні масиви та покажчики
- •11 Символьні рядки
- •11.1 Основні відомості про представлення рядків
- •11.2 Функції роботи з рядками
- •1. Функції введення рядків.
- •2. Функції виведення рядків.
- •14 Лекція №14
- •14.1 Вказівники Лекція № 2 - Вказівники та посилання
- •1.2.1. Вказівники
- •6. Вказівники і масиви
- •6.1. Вказівники і адреси
- •6.2. Вказівники і аргументи функцій
- •6.3. Вказівники і масиви
- •6.4. Адресна арифметика
- •6.5. Вказівники символів і функції
- •6.6. Вказівники – не цілі значення
- •6.7. Багатовимірні масиви
- •6.8. Масиви вказівників (вказівники на вказівники)
- •6.9. Ініціалізація масивів вказівників
- •6.10. Вказівники і багатовимірні масиви
- •6.11. Командний рядок аргументів
- •6.12. Вказівники на функції
- •Посібник для початківця про вказівники
- •6. Вказівники і структуровані програмні змінні
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •8. Вказівники і динамічні змінні (керування пам'яттю)
- •Void* operator new(size_t t)
- •Void operator delete(void* p)
- •Void main()
Вказівники
1 Основні відомості про вказівники
В С++ використовується дві конструкціі для непрямого звертання до змінної: вказівники та посилання. За своєю суттю вони є носіями адреси інформації, яка зберігається в пам'яті.
Вказівники в Сі та С++ використовується набагато інтенсивніше, аніж, скажімо, у Паскалі, тому що іноді деякі обчислення виразити можливо лише за їх допомогою, а частково і тому, що з ними можна розробити більш компактні та ефективніші програми, аніж ми використовували б звичайні засоби. Навіть існує твердження - аби стати знавцем Сі, потрібно бути спеціалістом з використання вказівників.
Вказівники - це складний матеріал, і може знадобитись доволі багато часу, щоб опанувати його.
Коли компілятор обробляє оператор визначення змінної, він виділяє пам'ять відповідно до її типу і при необхідності ініціалізує її заданим значенням.
На машинному рівні імена змінних у командах не використовуються, а тільки адреси, сформовані транслятором з використанням імен змінних. Усі звертання в програмі до змінної по її імені заміняються компілятором на адресу області пам'яті, де зберігається значення змінної.
Проте програміст не має доступу до цих адрес, якщо він не використовує спеціальний механізм. Програміст може сам визначати змінні, у яких будуть зберігатися адреси областей пам'яті. Такі змінні називаються вказівниками.
За допомогою вказівників, наприклад, можна:
- обробляти одновимірні та багатовимірні масиви, рядки, символи, структури і масиви структур;
- динамічно створювати нові змінні в процесі виконання програми;
- обробляти зв'язані структури: стеки, черги, списки, дерева, мережі;
- передавати функціям адреси фактичних параметрів;
- передавати функціям адреси функцій в якості параметрів.
2. Вказівники та посилання
Вказівник (pointer) - спеціальна змінна, в якій зберігається адреса іншої змінної чи програмного об'єкта. Нульове значення (нульова адреса) задається константою NULL. Значення вказівника - це беззнакове ціле, воно повідомляє, де розміщена змінна (її адреса), і нічого не говорить про саму змінну.
Володіння адресою дає вказівнику можливість отримати доступ до значення змінної, яке зберігається за даною адресою. Таке звертання до даних називається непрямим.
Багато програм та ідей покладаються на вказівник як основу для їх розробки, наприклад, зв'язані списки.
Як оголосити вказівник? Змінна типу вказівник оголошується подібно звичайним змінним із застосуванням унарного символу "*".
Загальний синтаксис для оголошення вказівника і ініціалізація його адресою існуючою змінною має вид:
тип * ім’я-вказівника [ = &змінна];
Тут через [] подано необов’язкову ініціалізацію вказівника.
Тип - найменування типу змінної, адресу якої буде містити змінна-вказівник (на яку він буде вказувати). Тип змінної визначає об'єм ОП, що виділяється змінній, з якою пов'язаний вказівник. Для того, щоб машинною програмою обробити (наприклад, прочитати або записати) значення змінної за допомогою вказівника, треба знати адресу її початкового (нульового) байта та кількість байтів, що займає ця змінна. Вказівник містить адресу нульового байта цієї змінної, а тип змінної, що адресується, визначає, скільки байтів, починаючи з адреси, визначеної вказівником, займає це значення.
&змінна - це адреса деякої величини (ціле без знака). Вказівник містить адресу першого байту змінної визначеного типу.
При оголошенні декількох вказівників знак * ставиться біля кожного ідентифікатора.
int *one, *two;
С++ дає можливість оголошувати вказівники двояко:
char *name; char* name;
Ці оголошення є повністю рівносильними. В обох випадках cтворено вказівник на змінну типу char, яка зберігається у деякому місці в пам'яті. Як правило, перше оголошення використовується для створення вказівників, а друге - використовується в прототипах функцій, де оголошуються лише типи без змінних