Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Доступ до компонентів структури

Таблиця 1.

struct DATE d; struct DATE d,*d1; d1 = &d;
d.date = 1; d.year = 2000; strcpy(d.mon_name, “січ”); d1->date = 1; d1->year = 2000; strcpy(d1->mon_name, “січ”);

 

Структури можна об'єднувати в масив.

Тоді запис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в" і "Андрій". Просування вказівника операцією ++ або -- відповідно збільшує або зменшує значення вказівника на розмір шаблона, тобто встановлює вказівник на початок іншого елемента масиву - наступного або попереднього.

 



Читайте також:

  1. III. Процедура встановлення категорій об’єктам туристичної інфраструктури
  2. Адаптивні організаційні структури управління.
  3. Аналіз асортименту й структури випуску продукції.
  4. Аналіз динаміки і структури валового нагромадження.
  5. Аналіз динаміки і структури витрат підприємства
  6. Аналіз динаміки та структури банківських доходів
  7. Аналіз динаміки та структури валютних операцій
  8. Аналіз показників складу, структури й технічного стану основних фондів.
  9. Аналіз рівня, динаміки і структури обсягу виробленої та реалізованої продукції
  10. Аналіз рівня, динаміки та структури фінансових результатів підприємства
  11. Аналіз складу та структури дебіторської заборгованості
  12. Аналіз структури витрат у виробництві СМЗ




Переглядів: 1249

<== попередня сторінка | наступна сторінка ==>
Судово-медична діагностика отруєнь. | Заключна частина.

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.006 сек.