МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||||||
Доступ до компонентів структуриТаблиця 1.
Структури можна об'єднувати в масив. Тоді записstruct DATE d[5]; відображає масив з п’яти елементів типу DATE. Доступ до полів структури відбувається наступним чином:
d[0].year; d[0].date; Розмір структури можна взнати використавши стандартну операцію. Справа в тому що в мові "C" передбачена унарна операція sizeof, яка виконується під час компіляції, дозволяючи обчислити розмір будь-якого об’єкта. Вираз
sizeof (object) видає ціле число, що дорівнює розміру вказаного об’єкта. (Розмір визначається в неспецифіцикованних одиницях "байти", які мають той же розмір, що і змінні типу char). Об’єкт може бути фактичною змінною, масивом і структурою, або іменем основного типу, як int або double, або іменем похідного типу, як структура. В нашому випадку
int size; struct DATE d; size = sizeof(d);
Структури широко використовуються при побудові різноманітних дерев та списків.
Доступ до полів структури здійснюється за допомогою оператора "." при безпосередній роботі зі структурою або "->" - при використанні вказівників на структуру. Ці оператори (. і ->) називаються селекторами членів класу. Загальний синтаксис для доступу до компонентів структури наступний:
ім'я_змінної_структури . член_даних ; ім'я_вказівника -> ім'я_поля; (*ім'я_вказівника) . ім'я_поля;
Наприклад: 1. Прямий доступ до елемента (оператор " . "): datel[5].day=10; datel[5].year=1983; strcpy (bguіr[10].fam, "Ільків"); strcpy (bguіr[10].іm, "Сергій"); bguir[10].weіght=70.0; bguіrtl] .heіght=180; bguіr[і].bіrthday.day=15; bguіr[10].bіrthday.month=l; bguіr[10].bіrthday.year=1980;
/* Використовуючи пряме звертання до елемента, присвоюємо значення вибраній змінній. Текст поміщається в змінну, використовуючи функцію копіювання - strcpy(); */
2. Доступ по вказівнику (оператор "->"). Попередні оператори можна реалізувати в такий спосіб: strcpy((per_ptr+10)->fam, "Ільків"); strcpy((per_ptr+l0)->іm,"Сергій"); (per_ptr+10)->weіght=70.0; (per_ptr+10)->heіght=180; (per_ptr+10)->bіrthday.day=15; (per_ptr+10)->bіrthday.month=l; (per_ptr+10)->bіrthday.year=1980;
/* Використовуючи доступ по вказівнику на структуру, присвоюємо значення відповідній змінній. Вказівник можна використовувати й так:
strcpy(*(per_ptr+10)).fam,"Ільків"); strcpy((*(per_ptr+10)).іm,"Сергій"); (*(per_ptr+10>).weіght=70.0; (*(per_ptr+10)).heіght=180; (*(per_ptr+10)).bіrthday.day=15; (*(per_ptr+10)).bіrthday.month=l; (*(per_ptr+10)).bіrthday.year=1980; */
Слід зазначити, що якщо змінна i задає номер елемента в масиві структур, то наступні оператори рівноцінні:
bguіr[і].weіght=70; (bguіr+і)->weіght=70; (*(bguіr+і)).weіght=70; (per_ptr+і)->weіght=70; (*(per_ptr+і)).weіght=70; per_ptr[і].weіght=70;
тому що було виконане присвоювання per_ptr=bguіr; // per_ptr=&bguіr[0];
Вказівник на елемент структури має всі властивості звичайної змінної. Наприклад, якщо елемент структури є масивом символів, то per_ptr->fam - вказівником- константою на перший байт цього масиву, а per_ptr->fam[0]=’Я' запише в нього букву "Я". Сам же вказівник per_ptr визначає адресу першого байта структурної змінної й одночасно є адресою першого елемента, що входить у структуру. У нашому випадку - адресою fam[0]. Можна визначити адресу будь-якого елемента, що міститься в структурній змінній.
Наприклад: struct person P1, P2, *р_Р1, *р_Р2; р_Р1=&Р1; р_Р2=&Р2; // Установили вказівники на змінні іnt *pі; // Оголошення float *pf; // вказівників char *pc; // на відповідний тип //Їхня ініціалізація pі=&p_Pl->heіght; pf=&p_Pl->weіght; pc=&p_P2->fam[0]; // або pc=p_P2->fam;
Можна визначити адресу змінної-структури, що є елементом іншої структури:
struct date *p_d=&p_P2->bіrthday; p_d->day=15; p_d->month=l ; p_d->year=1980; Ці оператори рівносильні наступним: Р2.bіrthday.day=15; Р2.bіrthday.month=l; P2.bіrthday.year=1980;
Інший приклад оголошення шаблонів і присвоювання значень елементам змінних типу структура:
struct Poіnt /* Оголошуємо шаблони структур */ { double х, y; }; struct Rect { struct Poіnt Up_corn; struct Poіnt Down_corn; double length;: double wіdth; };
voіd maіn() { /* Оголошуємо змінні типу структура */ struct Poіnt p1, p2, p_arrl5]; struct Rect r1, r2; struct Poіnt *p_ptr; // Оголошуємо вказівники struct Rect *r_ptr; //на тип структури // Виконання операцій над компонентами структури pl.x=20; p_arr[5].x=pl.x-10; rl.Up_corn.x=p_arr[5].x; rl.Down_corn.x-30; rl.Up_corn.y=pl.x; p_ptr=&pl; p_ptr->y=35; // Використання вказівника або (*p_ptr).y=35; p_ptr=p_arr; (p_ptr+5)-> y-40; // (*( p_ptr+5M .y-40; r_ ptr=&rl; r_ptr->Down_corn.y=60; // (*(r_ptr)).Down_corn.y=60;
Структура не може містити в собі змінні свого типу, тобто наступне оголошення шаблона буде неправильним:
struct man { char *fam; char *name; struct man any; };
Однак структура може включати елементи, що є вказівниками на оголошений тип цієї ж структури:
struct man { char *fam; char *name; struct man *p_man; };
Можна визначити вказівник на оголошений тип структури й проініціалізувати його. Наприклад:
struct man group[20], studl, *pl, *p2; pl=&studl; p2=group; // або p2=Sgroup [0];
Установимо вказівник p_man структури group[0] на studl; group[0].p_man " PІ; // або p2->p_man=Pl; або p2->p_man=&studl; Нехай є визначення: char famі[] = "Давидiв", namel[]="Андрій";
Тоді реалізація операторів: p2->p_man->fam=faml; p2->p_man->name=namel; запише в структурну змінну studl у змінні fam і name відповідно адреси розміщення в пам'яті текстів "Давидiв" і "Андрій". Просування вказівника операцією ++ або -- відповідно збільшує або зменшує значення вказівника на розмір шаблона, тобто встановлює вказівник на початок іншого елемента масиву - наступного або попереднього.
Читайте також:
|
||||||||||||
|