
- •Вбудовані функції. Мета застосування. Правила створення.
- •Препроцесор. Директива включення.
- •Препроцесор. Створення символічних констант та макросів.
- •Порівняльна характеристика макросів та вбудованих функцій.
- •Умовна компіляція програми. Директиви умовної компіляції. Приклади.
- •Поняття вказівника. Оголошення та ініціалізація. Мета використання.
- •Вирази та арифметичні дії над вказівниками.
- •Зв’язок масивів та вказівників. Обробка одновимірних масивів за допомогою вказівників. Приклади.
- •Вказівники. Вказівники як аргументи функцій та результати функцій.
- •Передача параметрів у функції за значенням та посиланням. Порівняльна характеристика.
- •Створення та обробка динамічних масивів. Видалення та вставка елементів у динамічний масив.
Вказівники. Вказівники як аргументи функцій та результати функцій.
Нагадаємо що по замовчуванню передача параметрів в функцію відбувається за значенням. Тобто при передачі параметрів значення фактичного параметра компілюється у форматний. Таким чином яка небудь змінна формального параметра не веде до зміни фактичного.
Приклад. Функція яка отримує обмін значеннями між двома своїми параметрами.
Void Bad Swap(int a, int b){ int temp =a; a=b; b=temp; cout<< “In BadSwap()a=”<<a<< “b=”<<b<< endl;}
Int main(){ int x=2, y=10; Bad Swap(x,y); cout<<”x=”<<x<<”y=”<<y<<endl;}
Зобразимо розподіл стекової пам’яті при роботі нашої програми.
Як бачимо функція Bad Swap не змогла поміняти місцем значення своїх параметрів.
Для зміни параметрів функції використовують передачу параметрів за посиланнями.
2 способи: By value передача за допомогою вказівників(С)
By reference передача за ссилкою(посиланням)(С++)
Перепишемо функцію Bad Swap передаючі у неї не значення параметрів (потрібних змінних для обміну) а адреси потрібних змінних.
Void Swap(int *p1, int*p2)//вказівник 1, вказівник 2
PHOTO { int temp =*p1; *p1=*p2; p2=temp;}
Int main (){ int x=2,y=10; Swap(&x,&y)//адреса х, адреса у
Cout<<x<<` `<<y<<endl;}
Приклад 2: Написати функцію яка отримує 2 вказівники ні змінні, і першу змінну подвоює, а другу потроює.
Void Fun(int *p1, int*p2) { *p1*2; *p2*3;} int main() {int x=1; y=2; Fun(&x,&y) cout<<x<<` `<<y<<endl;}
Функції можуть повертати вказівники, але для конкретної роботи програми має повертатися вказівник на дане яке повинне існувати після роботи функції. Таким чином вказівник як локальне дане повертати неможна.
Задача 1. Написати функцію яка отримує одновимірний дробовий масив і повертає вказівник на його найбільший елемент. Void Print(const double arr[] int size); Використати функцію для розвязку таких задач:
*Знайти найти найбільший елемент масиву, *змінити знак найбільшого елементу масиву на протилежний
Double* Point To Max(double arr[], int size){ double *p, *pMax=arr; for(p=arr+1; p<arr+size;++p) if(*p>*pMax) pMax=p;// запам’ятовуємо адресу найбільшого return pMax;} int main(){double A[5]={1.2, 3.7, 100.5, 67,88.1} cout<< “Max=”<<*PointToMax(A,5)<<endl;
PointToMax(A,5) виклик функції поверне адресу найбільшого елементу масиву, тобто 100,5 Щоб отримати значення самого елемента. Цей вказівник потрібно розіменувати * PointToMax(A,5) *=-1; і домножуємо на -1;
Таким чином у цьому рядку виконується доступ до найбільшого елементу масиву
Print(A,5);
Вказівники та посилання С++. Порівняльна характеристика.
Посилання є прихованою формулою вказівника. Тип послання позначають &. Посилання при оголошенні повинно бути пов’язане із подвійною змінною
Float z = 2.77f;
Float &nick z=z; // створює посилання nick z на z.
Тепер із змінною z можна працювати за допомогою посилання nick z, при цьому посилання не потрібно розіменовувати, на відміну від вказівника
++nick z; // ++z;
Інакше посилання називають псевдонімом об’єкта.
Посилання використовують для передачі параметрів за посилання.
Вказівники.
Кожне визначення змінної чи константи у ході програми супроводжується виділенням ділянки пам’яті. Розмір ділянки залежить від типу даного. Кожен байт оперативної пам’яті має унікальний номер (ціле число). Номер комірки називають ще адресою. Адреса даного певного типу це адреса самого першого (лівого) байта даного. Нехай маємо наступне визначення
Int remember = 123; // 4б
Щоб отримати адресу даного користуються операцією взяття адреси & (амперсант)
Змінні, які можуть містити адреси називають вказівниками (pointer) Вказівники поділяють на 2 групи :
Типовані (тип *)
Без типові (void *) – універсальні
Типізовані пов’язані з певним типом, тобто можуть містити адресу тільки даного певного типу.
Наприклад. Вказівник на int ( int*) можуть зберігати адреси змінних типу int.
Void вказівники не пов’язані з певним типом і тому можуть зберігати адресу даного будь-якого типу.
Визначення типізованого вказівника у загальному має вигляд : тип * ім’я вказ 1, * ім’я вказ 2..;
Int * a, b, c; (*a – вказівник, b , c – інтові змінні)
Унарна операція * називається розіменуванням вказівника ( indirection) Дана операція дозволяє отримувати доступ до даного через вказівник на нього
Посилання. Посилання як аргументи та результати функцій у С++.
Посилання є прихованою формулою вказівника. Тип послання позначають &. Посилання при оголошенні повинно бути пов’язане із подвійною змінною
Float z = 2.77f;
Float &nick z=z; // створює посилання nick z на z.
Тепер із змінною z можна працювати за допомогою посилання nick z, при цьому посилання не потрібно розіменовувати, на відміну від вказівника
++nick z; // ++z;
Інакше посилання називають псевдонімом об’єкта.
Посилання використовують для передачі параметрів за посилання.
Посилання на дане може виступати результатом функції. Так як і у випадку повернення вказівника посилання повинно посилатися на існуючу за межами ф-цію змінну
Фактичним параметром може бути тільки змінна. Якщо посилання – константа( const тип &) фактичним параметром може бути як змінна так і іменна константа