Структура в Сі - тип даних, призначений для розміщення значення різного типу в одному об'єкті. Корисний, коли необхідно об'єднати кілька змінних з різними типами під одним ім'ям. Роблять програму більш компактної, нею зручніше керувати. Структура має схожі риси з масивами і класами.
Масиви
Перш ніж говорити про структуру у Сі, потрібно описати масив.
Існують одновимірні масиви, двовимірні, тривимірні. Одновимірний - це такий, у якого є тільки один рядок з заповненими значеннями. Двовимірний - одновимірний масив, в межах якого знаходяться інші одномірні масиви. Звичайний масив в Сі записується так: int a[4]= {123 4}. Бачимо, що a - ім'я, int - тип даних, всередині фігурних дужок {} знаходяться значення, між квадратними дужками[]вказується довжина, тобто кількість елементів. Кількість елементів є статичним, дорівнює 4. Це означає, що якщо в цьому прикладі користувач додасть п'яте значення, компілятор видасть помилку. Якщо спочатку не відомо кількість, вони можуть бути додані пізніше, але в квадратних дужках не ставиться значення.
Двовимірний оголошується схожим чином. Наприклад, масив, який містить 5 елементів-масивів, при цьому кожен містить по 3 елементи оголошується так: int a[5] [3].За аналогією з одновимірним додавати нічого не можна, щоб не отримати помилку компілювання. Розрізняють динамічні і статичні. Статичний - це такий, який вміщує фіксовану кількість даних, тобто має постійну довжину. Під динамічним розуміється той, розмір якого не обмежується, він може змінюватися під час виконання програми. Ініціалізація динамічного масиву відбувається без зазначення точної кількості.
Класи
Клас і структура схожі між собою, але відрізняються деякими нюансами. Що це таке? Це абстракція, що описує методи ще не існуючого об'єкта. Після створення об'єкт або, як він називається по-іншому, екземпляр класу має конкретні властивості. Методи можуть використовуватися всередині, зовні або при спадкуванні.
Клас оголошується так: class /*class name*/ { private: /* спецификатор доступу private означає, що управління методами можливо тільки усередині класу*/ public: /* робить властивості доступними для інших частин коду */ protected: /* успадковані класи отримують можливість використовувати ці властивості */ }.
Що таке структура в мові Сі
Призначена для зберігання кілька типів даних. Наприклад, щоб створити каталог журналів, потрібно мати список з такими параметрами: дата видання; номер випуску; назва; вартість. Для вирішення цієї задачі можна було б застосувати масиви. Оголошуємо масив з датами int date[20], номерами int number[20]назвами char title[80]вартістю int price[20]. Звертаючись за індексом, ми отримуємо необхідну інформацію. Висновок інформації про твір під номером 3 виглядає так: cout "дата випуску:" date[3]", номер: "number[3]"назва:" title[3]“ вартість: “ price[3]). Структура спрощує запис, описується наступним чином: struct book { int date; int number; char title[20]; int price[20]; }.
Бачимо одне з головних переваг - присутні різні типи змінних. Програміст не просто економить час - він спрощує код, надалі йому буде набагато простіше працювати.
Оголошення
Структури в Сі грають дуже важливу роль - об'єднання даних різного типу. Для початку потрібно вказати ім'я структури і властивості. struct name { type member; } Struct - ключове слово, воно починає оголошення, name - ім'я, type - тип даних, member - ім'я елемента. Оголошується так: name name2 де name - заданий при створенні структури ім'я, а name2 - ім'я змінної. Оголосити змінні можна на етапі створення. struct name { type member; } name2; Перший і другий приклад рівносильні одна одній. Якщо є необхідність оголосити кілька змінних, вони перераховуються через кому. struct name { type member; } name2 name3 name4.
Ініціалізація
Після оголошення структуру в Сі необхідно ініціалізувати. struct name {; char member }; name name2; name2.member="a"; Инициазация може відбуватися при створенні. struct name { char member = "a"; } name2; Структура такий же синтаксис, як у класу. У них практично однакова поведінка, можливості. Все, що знаходиться в тілі класу, за замовчуванням недоступне для використання іншими об'єктами. У структури все навпаки - всі поля і методи є публічними. Вручну можна вказати модифікатор доступу private, і таким чином відкрити доступ інших функцій або класів.
Масив структур Сі
Масиви - це безліч компонентів одного типу. Вони розташовуються поруч один з одним, звернення до кожного з них здійснюється за числовим індексом. Існують одновимірні масиви, двовимірні, тривимірні.
У одновимірного тільки один рядок і n-e кількість елементів. Оголошення виглядає так: int a[16]; Масив структур в Сі оголошується так: struct MyStruct { int a; }; MyStruct obj1[10]; У цьому прикладі ми створили MyStruct з елементом цілочисельного типу під ім'ям "а". Оголошуємо змінну obj1[]- вона є масивом, що складається з 10 елементів. При оголошенні декількох масивів одного типу використовується MyStruct obj1[10], obj2[5], ініціалізація відбувається під час оголошення. Виглядає так: struct MyStruct { int a; } obj1[10]; Створення масиву структур з динамічним виділенням пам'яті виглядає точно також, як створення простого динамічного масиву. Для цього застосовується покажчик на структуру Сі. Вказівник - це змінна, яка не містить значення, а вказує на ту змінну, яка має якесь значення. Відповідно, покажчик містить адресу цієї змінної, на яку посилається. Наприклад, ptr = &var1 означає, що змінної зі знаком амперсанда присвоєний тільки адресу на змінну, але не саме значення. Тепер всі значення var1 доступні через змінну-вказівник ptr.
Операція * відсилає до вмісту комірки, на яку вказує мінлива після цього символу. Наприклад, *ptr говорить про те, що тут містяться значення, взяті з комірки з адресою до ptr. Щоб виділити пам'ять для динамічних змінних, використовують операцію new. У нас є struct MyStruct { string a; } Виділяємо ділянка пам'яті, заносимо туди якесь значення MyStruct * point = new MyStruct[1]; Для видалення динамічних змінних використовуємо операцію delete. Щоб звільнити місце, вводимо delete p[];
Доступ
Всі елементи за замовчуванням є публічними, тому інші класи їх можуть використовувати. Щоб задати або змінити деякі значення, спочатку потрібно звернутися до елементу і тільки потім зробити відповідні дії.
Створюємо myStruct з ім'ям змінної b. struct myStruct { string fio; long num; } b; Звертаємося до fio: b.fio і задаємо довільне значення. Наприклад, b.fio = "Ivanov". Розглянемо такий приклад. struct myStruct { string fio; long num; } tel[2]={ {"Іванов", 456756}, {"Петров", 632345} }; У даному прикладі у нас є масив структур з рядками і числами. Щоб вивести на екран прізвище Іванов, використовуємо наступне: cout myStruct tel[1].fio; Коли захочемо отримати значення 456756 виконуємо cout myStruct tel[1].num.
Структура і функції
Може використовуватися як аргумент функція в структурі Сі. struct myStruct { char text[100]; int value; }; Маємо змінну value, рядок text на 100 символів. Створюємо змінну menu типу myStruct: myStruct menu. У наступному прикладі функція приймає покажчик на структуру як аргумент, а в тілі безіменній функції відбувається ініціалізація цих змінних. void item(myStruct menu) { sprintf(menu.text,"One item"); menu.value=50; }.
Висновок
Структура - це такий набір, зразок масиву, але при цьому всі елементи можуть бути різного типу. Дуже схожа на клас, але відрізняється тим, що властивості за замовчуванням доступні для використання іншими класами, тобто мають спецификатор public. Створюється за допомогою ключового слова struct, а всередині фігурних дужок {} вказуються властивості. struct name { int member; }; Оголошення відбувається на етапі створення або після. struct name { int member; } a; або struct name { int member; } a; struct name a.