Структури в Сі та їх передача

Структури в Сі та їх передача

Структура в Сі - тип даних, призначений для розміщення значення різного типу в одному об 'єкті. Корисно, коли необхідно об 'єднати декілька змінних з різними типами під однією назвою. Роблять програму більш компактною, нею зручніше керувати. Структура має схожі особливості з масивами і класами.

Масиви

Перш ніж говорити про структуру в Сі, потрібно описати масив.


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

Звичайний масив у Сі записується так: int a[4] = {1, 2, 3, 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.