
- •Вбудовані функції. Мета застосування. Правила створення.
- •Препроцесор. Директива включення.
- •Препроцесор. Створення символічних констант та макросів.
- •Порівняльна характеристика макросів та вбудованих функцій.
- •Умовна компіляція програми. Директиви умовної компіляції. Приклади.
- •Поняття вказівника. Оголошення та ініціалізація. Мета використання.
- •Вирази та арифметичні дії над вказівниками.
- •Зв’язок масивів та вказівників. Обробка одновимірних масивів за допомогою вказівників. Приклади.
- •Вказівники. Вказівники як аргументи функцій та результати функцій.
- •Передача параметрів у функції за значенням та посиланням. Порівняльна характеристика.
- •Створення та обробка динамічних масивів. Видалення та вставка елементів у динамічний масив.
Вирази та арифметичні дії над вказівниками.
Над вказівниками можна здійснювати ряд арифметичних дій. При цьому передбачається, що якщо вказівник p відноситься до типа T*, то p вказує на елемент деякого масиву типа T. Тоді р+1 є Вказівником на наступний елемент цього масиву, а р-1 - Вказівником на попередній елемент. Аналогічно визначаються вирази р+n, n+p і р-n, а також дії p++, p--, ++p, --p, p+=n, p-=n, де n - ціле число. Поважно відзначити, що арифметичні дії з вказівниками виконуються в одиницях того типа, до якого відноситься вказівник. Тобто р+n, перетворене до цілого типа, містить на sizeof(T)*n більше значення, чим р.
З рівності p+n==p1 виходить, що p1-p==n. Саме так вводиться оператор різниці двох вказівників: його значенням є ціле, рівне кількості елементів масиву від p до p1. Відзначимо, що це - єдиний випадок в мові, коли результат бінарного оператора з операндами одного типа належить до принципово іншого типу.
Сума двох вказівників не має сенсу і тому не визначена. Не визначені також арифметичні дії над вказівниками void*, що не типізуються.
Нарешті, всі вказівники, у тому числі і що не типізуються, можна порівнювати, використовуючи операторів відношення >, <, >=, <= ==, !=
Присвоювання |
Вказівникові можна присвоїти значення:присвоїти адресу, отриману операцією &, або взятий з адресної константи (імені масиву) |
Посилання за вказівником (за адресою) |
Операція посилання (*) дає значення, що знаходиться у змінній на яку є вказівка. |
Отримання адреси |
Можна застосувати і до вказівника, отримавши вказівник на вказівник. |
Інкремент Декремент |
Додавання або віднімання цілого числа дає нову адресу в пам’яті . |
Обчислення зміщення |
Відстань між вказівниками (або елементами) обчислення за допомогою віднімання |
Порівняння |
Операція дійсна лише для вказівників на один масив |
Зв’язок масивів та вказівників. Обробка одновимірних масивів за допомогою вказівників. Приклади.
Існує тісний зв'язок між вказівниками та масивами. Розглянемо одновимірний масив з 5ти елементів типу інт. const int size = 5; int Arr[size]={10,12,15,20,23}
Імя одновимірного масиву є константою(адресою) вказівником на його перший елемент тобто компілятор імя Arr читає як дане такого типу. Int*const Arr=адреса; До типізованого вказівника можна додати ціле число чи відняти від нього і в результаті отримуємо теж вказівник. Вираз Arr+K компілятор розуміє Arr+K*sizeof(int), інакше кажучи вираз Arr+K є адресою елемента з індексом К.
Arr+K=&Arr[k]
*(Arr+K) розуміється ~ Arr[k]
Насправді компілятор індексні вирази перетворює у адресні вирази.
++*Arr;//збільшити нульовий елемент масиву на 1 ++Arr[0];
++*(Arr+0)
4[Arr]~*(4+Arr)
Типізовані вказівники одного і тогож типу можна віднімати. Різниця вказівників має зміст тоді, коли вказівники посилаються на елементи одного і тогож масиву, в такому випадку різниця обчислюється як кількість елементів розміщених між вказівниками.
Int*p=Arr+1, *q=Arr+size -1;
Cout<<q-p<<` `<<p-q<<endl;// q-p=int 3, p-q=-3
Arr+4-(Arr+1)
Вказівнки можна порівнювати однкового типу. Або один з вказівників має бути універсальним.
==, != - для довільних вказівників
>,<,>=,<=-для вказівника в межах одного масиву.
p<q -> true
p!=q -> true
Створення та знищення динамічних змінних, масивів. Інтернет Для створення динамічних змінних використовують операцію new, визначену в C++:
покажчик = new имя_типа[ініціалізатор];
де ініціалізатор – вираз в круглих дужках.
Операція new дозволяє виділити і зробити доступною ділянка динамічної пам'яті, яка відповідає заданому типу даних. Якщо заданий ініціалізатор, то в цю ділянку буде занесено значення, вказане в ініціалізаторі.
int* x=new int(5);
Для видалення динамічних змінних використовується операція delete, визначена в C++:
delete покажчик;
де покажчик містить адреса ділянки пам'яті, раніше виділений за допомогою операції new.
delete x;
Операція new при використанні з масивами має наступний формат:
new тип_массива
Така операція виділяє для розміщення масиву ділянку динамічної пам'яті відповідного розміру, але не дозволяє ініціалізувати елементи масиву. Операція new повертає покажчик, значенням якого служить адреса першого елементу масиву. При виділенні динамічній пам'яті розміри масиву повинні бути повністю визначені.
//виділення динамічній пам'яті 100*sizeof(int) байт
int* а = new int[100];