Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 1.13.1 Оголошення структури - Програмування С, С++теорія та практика (частина 1) - Studbook

Програмування С, С++теорія та практика (частина 1)

1.13.1 Оголошення структури

Структури дозволяють об’єднувати в єдиному об’єкті сукупність значень, які можуть мати різні типи. Оголошення структури здійснюється за допомогою ключового слова іігисі.

Синтаксис опису структури виглядає так :

5{гис{ [ім’я_структури]

{

типі елементі; тип2 елемент2;

типИ елементИ;

} [список описів];

З метою ознайомлення з цим типом даних розглянемо найпростіший приклад представлення поняття “дата”, що складається з декількох частин: число (день, місяць, рік), назва тижня та місяця:

з'Ьгис'Ь йа'Ье { іп£ йау ; іп£ топ'ЬЬ ; іп£ уеаг;

сЬаг йау_пате[15]; сЬаг топ_пате[14];

} агг[100],*рй,йа'Ьа,пем_йа£а;

В даному прикладі оголошуються:

йаіа, пем>_йаІа - змінні типу структури йаіе; рй - покажчик на тип йаґа

агг - масив із 100 елементів, кожний елемент якого має тип йаґе. Можливий і наступний опис структури з використанням Іурейе/:

£урегіе£ з'Ьгис'Ь туз'Ьгис'Ь { іп£ уеаг; сЬаг зіге;

£1оа£ £іе1гі;

} МЇ8ТКІТСТ;

МЇ8ТКГСТ з; /* те саме, що Й зїгисї туз'Ьгис'Ь з; */

Пам’ять розподіляється у структурі покомпонентно, зліва-направо, від молодших до старших адрес пам’яті (рис. 1.18).

■Ьурегіе£ з'Ьгис'Ь гі.а'ЬаТурез {

£1оа£ аЕІоа'Ь; іп£ апіп^; сЬаг а8^гіпд[8]; сЬаг аСЬаг; сЬаг аЬопд;

} Ба'ЬаТурез;

Ба'ЬаТурез гі.а'Ьа;

 

 

 

 

 

Рис. 1.18. Зберігання елементів структури у пам’яті

Потрібно відзначити, що на відміну від описів інших типів даних, опис структури не виділяє місця у пам’яті під елементи структури. Її опис визначає лише так званий шаблон, що описує характеристики змінних, що будуть розміщуватися у конкретній структурі. Щоб ввести змінні та зарезервувати для них пам’ять необхідно або після фігурної дужки, що завершує опис структури, вказати список ідентифікаторів,

як це зроблено у вищенаведеному прикладі, або окремо оголосити змінні типу, як ми це робимо у звичайних випадках.

Доступ до окремого елемента структури забезпечується операторами вибору: . (прямий селектор) та -> (непрямий селектор), наприклад,

з'Ьгис'Ь туз'Ьгис'Ь { іп£ і ;

сЬаг з'Ьг[21]; йоиЬ1е Й;

} з,*зр£г=&з;

з.і =3;

зр^г->й = 1.23;

Ініціалізація структури подібна до тієї, що у масивах, але з урахуванням розміщення даних різного типу.

з'Ьгис'Ь регзоп { сЬаг £гпт[20] ; сЬаг пт[30]; іп£ уеаг; сЬаг з;

};

зїгисї регзоп рое£={"Тагаз", "8ЬеV^сЬепк;о",1814,  'М'},

с1аззісз[]={{"А1£гей", "АЬо", 1939, 'М'},

{"Зеітоиг", "ЄіпгЬигд",}, /* ... */ {'^е££геу", "и1тап", 1938,               'М'}};

У вищенаведеному прикладі ініціалізується змінна роеґ і масив структур сіаззісз. Значення с1а88іс8[1].уеаг і с1а88іс8[1].8 мають значення відповідно 0 і ‘\0’.

Для змінних одного і того ж самого структурного типу визначена операція присвоювання, при цьому здійснюється поелементне копіювання значень полів.

зїгисї йа'Ье { іп£ Йау ; іп£ топ'ЬЬ ; іп£ уеаг;

сЬаг Йау_пате[15]; сЬаг топ_пате[14];

} Йа£а,пем_йа£а;

/* ... */

Йа£а=пем Йа£а;

Але, для порівняння структур необхідно перевіряти рівність відповідних полів цих структур.

з'Ьгис'Ь роіп£

{

£1оа£ х,у; сЬаг с;

} роіп^1,роіп^2;

і£ (роіп£1.х==роіп£2.х&&роіп'Ь1.у==роіп'Ь2.у&&

роіп£1.с==роіп£2.с)

{

/* ... */

};

Звертання до окремих елементів структури теж не викликає труднощів: йа£а.уеаг=2005 ;

ргіп^£("%й-%й-%й" ,йа'Ьа.йау,йа'Ьа.топ'ЬЬ,йа'Ьа.уеаг); зсап£("%й",йа£а.йау); де^з(агг[0].йау_пате);

Доцільним та корисним є зв’язок структур та покажчиків, який дозволяє обійти деякі складні моменти. Так опис йаіе *рйаїе утворить покажчик на структуру типу іїаґе. Використовуючи цей покажчик, можна звернутися до будь-якого елемента структури шляхом застосування операції -> , тобто йаіе ->уеаг , або що еквівалентно операції (*ріїаІе).уеаг. Однак слід зауважити, що спільне використання цих типів потребує від програміста достатньо високої кваліфікації, аби використовувати можливості найбільш ефективно та безпомилково.

Приклад 1.

#іпс1ийе<з'Ьйіо.Ь>

#іпс1ийе<сопіо.Ь>

#йе£іпе МАХТІТ 41 #йе£іпе МАХАШ? 31

з'Ьгис'Ь Ьоок {

сЬаг £і£1е[МАХТІТ]; сЬаг аи^Ьог[МАХАиТ];

£1оа£ Vа1ие;

};

Vоій таіп ()

{

з'Ьгис'Ь Ьоок ІіЬгу;

ргіп^£("Введіть назву книги.\п"); де£з(ІіЬгу.£і£1е) ;

ргіп^£("Тепер введіть прізвище автора.\п");

де£з(1іЬгу.аи'ЬЬог);

ргіп^£("Тепер введіть ціну.\п");

зсап£("%£",&1іЬгу.Vа1ие);

ргіп^£("\п%з '%з',%д дгп.\п",1іЬгу.аи^Ьог,

1іЬгу.£і£1е,1іЬгу.Vа1ие);

};

Кожний опис структури вводить унікальний тип структури, тому в наступному фрагменті програми:

з'Ьгис'Ь А { іп£ і,і; йоиЬ1е й;

} а, а1; з'Ьгис'Ь В { іп£ і,і; йоиЬ1е й;

} Ь;

об’єкти а і а1 мають однаковий тип кігисі А, але об’єкти а і Ь мають різні типи структури. Структурам можна виконувати присвоювання тільки в тому випадку якщо і вихідна структура, і структура, які присвоюється мають один і той же тип.

а = а1; /*можна виконати, так як а і а1 мають однаковий тип */ а = Ь; /* помилка */

 

65