
- •Вказівники на функції. Масиви вказівників на функції. Приклади.
- •В казівники на функції. Функції як параметри функцій. Приклади.
- •Функції з довільним числом параметрів. Приклади.
- •Обробка символів та масивів символів. Бібліотечні функції обробки символів.
- •Рядки. Подання рядків у пам’яті. Ініціалізація. Рядкові літерали.
- •Структури. Оголошення та ініціалізація. Розміщення у пам’яті. Приклади.
- •Структури. Вкладені структури. Доступ до полів структур, вкладених структур. Приклади.
- •Структури. Вказівники на структури. Динамічні структури. Приклади.
- •Структури з бітовими полями. Оголошення та ініціалізація. Обробка.
- •Структури як параметри та результати функцій.
- •Масиви структур. Оголошення, ініціалізація. Обробка.
- •Об’єднання. Розміщення у пам’яті. Ініціалізація. Обробка.
Вказівники на функції. Масиви вказівників на функції. Приклади.
Нехай маємо однотипні змінні наприклад типу int і потрібно обробляти зміння ніби вони є в масиві. У таких випадках створюють масив вказівників на відповідні змінні.
{int a=5, b=10, c=-2, d=100, e=123;
int arr[5]={&a,&b,&c,&d,&e};
i
nt
Dob=1;
for (int i=0; i<5; ++i)
{cout <<*arr[i]<<”\t”;
Dob*=*arr[i];}
cout<<”\n Dobutok =”<<Dob<<endl; }
Розглянемо оголошення int *arr[5]. Таке оголошення називають складним, адже в ньому зустрічаються операція індексація [] і * одночасно. У складних оголошеннях ще використовують (). Інтерпретація оголошення відбувається за наступним алгоритмом:
шукаємо в оголошенні ідентифікатор (імя змінної)
аналізуємо операцію зправа від ідентифікатора і зліва і обираємо ту, що моє вищий пріоритет і т.д поки не доходимо до імені типу
Операції [] і () мають вищий пріоритет ніж *
В казівники на функції. Функції як параметри функцій. Приклади.
По замовчуванню передача параметрів в функцію відбувається за допомогою значення. Тобто при передачі параметрів значення фактичного параметру копіюємо у формальний. Таким чином, яка небуть змінна ФП не веде до зміни фактичного
Приклад: ф-ція яка отримує обмін значеннями між двома своїми параметрами
void BS (int a, int b)
{int temp=a;
a
=b
b=temp;
cout<<”In BS()a=”<<a”b=”<<b<<endl;}
int main()
{int x=2, y=10;
BS (x,y);
cout,,”x=”=x<<”y=”<<y<<endl;}
Зобразимо розподіл стекової памяті при роботі самої програми.
Як бачимо функція BS не змогла поміняти місцями значення своїх параметрів бо вона міняє місцями копії своїх параметрів. Для зміни параметрів функції використовують передачу параметрів за посиланням
by reterence – передача за посиланням
by value
Є 2 способи передачі параметрів за посиланням
передача за допомогою вказівників
передача за ссилкою (посиланням)
Перепишемо функцію BS передаючи нею не значення параметрів потрібних змінних для обміну а адреси потрібних змінних
void Swap (int *p1, int*p2)
{int temp=*p1
*p1=*p2
*p2=temp}
int main()
{int x=2,y=10;
Swap(&x,&y)
cout<<x<<’’<<y<<endl;}
Функції можуть повертати вказівники але для коректної роботи програми має повертатися вказівник на дане яке повинно існувати після роботи функції. Таким чином вказівник на *** дане повертати неможе.
Функції з довільним числом параметрів. Приклади.
У
С/C++ поряд з використанням функцій з
фіксованим числом параметрів можна
використовувати функції зі змінним
числом параметрів, тобто функції, у які
можна передавати дані, не описуючи їх
у прототипі й заголовку функції. Описи
цих даних заміняються трьома крапками.
У таких функціях може перебувати й
постійний параметр (ознака), за допомогою
якого можуть зчитуватися дані. Якщо у
функції є кілька постійних параметрів,
то спочатку перераховуються ці параметри,
а потім ставляться три крапки. Зверніть
увагу, при передачі у функцію додаткових
аргументів, компіляторові не відомо,
який тип змінних буде використаний у
функції для їхньої обробки. Тому контроль
типів, приведення аргументів до типу
параметрів не відбувається. Необхідні
перетворення повинен передбачити
програміст. Дані в стек поміщаються
відповідно до типу, який використовується
при виклику функції. В C++ повинен бути
хоча б один фіксований параметр.
Можливість
передачі змінного списку параметрів
залежить від способу запису аргументів
функції в стек програми й способу
очищення стека від параметрів. У С/С++
параметри записуються в стек з кінця
списку параметрів) і звільняє стек
викликаюча функція. Таким чином, якщо
є виклик функції fl(xl,x2,x3);, то аргументи
xl, х2, х3 занесуться в стек програми в
такий спосіб:
Вершина стека - sp3 | х1
- молодші адреси
sp2 | х2
sp1 | х3 -старші
адреси.
Наприклад: f2(5,xl,x2,x3,x4,x5); - тут
зазначене число аргументів - 5; f
xl,x2,x3,x4,0); - тут зазначена ознака кінця
списку - 0.
Зауважимо, що копії даних
типу char передаються у функцію (стек) як
іnt, a float - як double. Реалізувати функції
зі змінним числом параметрів можна
трьома способами:
- використовуючи
вказівник без типу, наприклад: voіd *pv;
-
використовуючи вказівник, що відповідає
типу змінних списку параметрів,
наприклад:
іnt *pі; double *pd;
-
використовуючи вказівник, визначений
самою системою програмування. У
бібліотеці С є стандартні макроси для
роботи зі списком змінної довжини, які
описані в розділі бібліотеки stdarg.h.
Таких макросів є чотири: va_lіst, va_start,
va_arg, va_end.
Приклад оголошення й виклику
функції:
іnt func (іnt, ...); - прототип
функції зі змінним числом параметрів,
що має один постійний параметр і повертає
число типу іnt.
іnt func(int k, ...){…}; -
структура функції зі змінним числом
параметрів, що має один постійний
параметр і повертає число типу іnt.
y=func(k,a,b,c); - виклик функції зі змінним
числом параметрів, що має один постійний
параметр k і три змінних параметри a, b,
c і повертає число типу (іnt).