Передача аргументом структури

Над структурами допустимі такі "операції":

!Неможливо структури порівнювати.

Копіювання відповідає передача структури аргументом у функції.

Присвоюванню відповідає повернення структури як результату функції.

Існує три підходи до передачі структур в функцію і повернення з неї:

  1. передача її членів окремо;
  2. передача структури цілком;
  3. передача покажчика на структуру.
Приклад 10: об'єкти, для яких будемо виконувати операції зі структурами. об'єкти типу __________________________________________________________________ "Точка" | "Прямокутник" __________________ | _______________________________________________ Struct Point | Struct Rect; |>; __________________ | _______________________________________________

За допомогою об'єктів цих типів напишемо кілька функцій.

Приклад 11: формування точки по її компонентів. struct point makepoint (int x, int y)

Визначимо за допомогою цієї функції об'єкт "екран" (як прямокутник розміром з екран монітор).


i об'єкт "середина екрану" (як точку з координатами центру екрана).

Приклад 12: формування об'єктів "екран" i "середина екрану". # Define MAXX 639 # Define MAXY 349 # Define MINX 0 # Define MINY 0. struct rect screen; / * Об'єкт "екран" * / struct point middle; / * Об'єкт "середина екрану" * / struct point makepoint (int, int); / * Створення лівого верхнього кута об'єкта "екран": * /screen.pt1 = makepoint (MINX, MINY); / * Створення правого нижнього кута об'єкта " екран ": * /screen.pt2 = makepoint (MAXX, MAXY); / * Створення об'єкта" середина екрану: * / middle = makepoint ((screen.pt1.x + screen.pt2.x) / 2, (Screen.pt1 .y + screen.pt2.y) / 2); Приклад 13: додавання точок. Struct Point addp (struct point p1, struct point p2)

Для формування результату використовується структура, передана першим аргументом. Це допустимо, тому що структура передається в функцію копією. Тому на відміну отmakepoint тут не потрібна локальна змінна типу struct для формування результату.

Приклад 14: чи належить точка p прямокутнику r? pt_in_rect (struct point p, struct rect r) / * Результат не є 0, якщо точка p належить прямокутнику r. інакше результат є 0 * /

Покажчики на структури нічим не відрізняються від покажчиків на звичайні змінні.

Приклад 15: покажчики на структури struct point * ps; / * Покажчик на структуру * / struct point t; struct point makepoint (int, int); t = struct point makepoint (15, 25); ps = t; / * * Ps - це структура t (* Ps). X = 15 (* Ps). Y = 25 * / printf ( "Це t: (% d,% d)", (* ps). X, (* ps). Y);

Дужки в цьому прикладі потрібні тому, що prio (.)> Prio (*).

<Указатель на структуру> -> <имя члена структуры>

Якщо р - покажчик на структуру. то г -> <член структуры> - це її член.

Властивості оператора ->:

  • бінарний;
  • iнфіксній;
  • найвищий пріоритет;
  • лiвоасоцiатівній.
Приклад 16: еквівалент прикладу 15.. printf ( "Це t: (% d,% d)", ps -> x, ps-> y); Приклад 17: struct rect r, * pr; pr = r; / * Еквівалентні: * / 1) r.pt1.x 2) pr-> pt1.x3) (r.pt1). X4) (pr-> pt1). XПрімер 18: передача структури аргументом по ссилке.main () struct point makepoint (int, int); void put (struct point *); p = makepoint (10, 12); put ( p);> void put (struct point *) Приклад 19: Використання декількох операторів для праці з структурами з урахуванням пріоритету операторов.struct * P; + + P-> len; / * Len + +, а не p + + * / + + (P-> len); / * Еквівалентна * / (+ + P) -> len; / * 1) + + p; (Перейти до наступного рядка) * / / * 2). Len; (Взяти його довжину) * / (P ++) -> len; / * 1). Len; (Взяти довжину рядка) * / / * 2) p + +; (Перейти до наступного рядка) * / p + + -> len; / * Еквівалентна * / * P-> str; / * * P-> str (то, на що посилається str - str [0]) * / * (P-> str); / * Еквівалентна * / * P-> str + +; / * 1) * p-> str (то, на що посилається str - str [0]) * / / * 2) str + +; / * (Перейти до наступного елементу - str [1]) * / (* P-> str) + +; / * 1) * p-> str (то, на що посилається str - str [0]) * / / * 2) збільшення на 1 коду символу, який міститься в str [0]) * / * P + + -> str; / * 1) * p-> str (то, на що посилається str - str [0]) * / / * 2) p + +; (Перейти до наступного рядка) * /

Аргументи командного рядка

У командному рядку виконуваного файлу, можна передати аргументи, записуючи їх через пробіл. Ці аргументи, які записані в командному рядку, являютсяфактіческімі для функції main. Формальні аргументи для функції main створюються ОС. Тому в функції main потрібно вміти їх обробляти.

Аргументи (формальні) функції main:

  • argc (argument count): кількість аргументів командного рядка;
  • argv (argument vector): покажчик на масив рядків, що містить самі аргументи.
Приклад 20: програма echo для друку аргументів командного рядка, які між собою розділені символом _ (щоб відрізнити рядок результатаот вхідного). Якщо командний рядок містить C:> echo Головна функція то програма echo напечатаетC:> echo_Головна_функцiя

Для програми echo операційна система побудує такі фактичні аргументи:

! Аргументи командного рядка є рядками.