Struct anketa
{
int id_nom;
char pib[30];
char data[10];
int st;
char adres[40];
float summa;
};
Цей запис називається описом структури. Вона починається з ключового слова struct і складається з укладеного у фігурні дужки списку описів. За словом struct може слідувати необов'язкове ім'я, яке називається іменем типу структури (іноді його називають тегом або ярликом структури). Цей ярлик іменує структуру і надалі може використовуватися для скорочення докладного опису. Змінні, згадувані в запису, називаються елементами. Слідом за правою фігурною дужкою, що закінчує список елементів, може слідувати список змінних, так само, як і у випадку базисних типів. Ось чому в наведеному вище описі структури після закриваючої фігурної дужки стоїть крапка з комою; вона завершує порожній список. Опис struct {....} p1, p2, p3; синтаксично аналогічний int p1, p2, p3 в тому сенсі, що кожен з операторів описує p1, p2, p3 як змінні відповідного типу і призводить до виділення для них пам'яті. Опис ж структури без наступного списку змінних не виділяє жодної пам'яті. Він тільки визначає форму структури і діє як шаблон. Якщо такий опис забезпечений ярликом (ім'ям типу), то його можна пізніше використовувати під час визначення фактичних екземплярів структури. Наприклад, використовуючи створений вище опис anketa, можна за допомогою рядка
struct anketa a0, a1, a2;
описати структурні змінні a0, a1, a2, кожна з яких будується за шаблоном, введеним структурою anketa. Будь-яка змінна a0, a1, a2 містить в строго визначеному порядку елементи id_nom, pib, data, st, adres, summa. Всі змінні, як і всі інші змінні мови С, отримують місця в пам'яті.
Структура може містити структури іншого типу в якості полів:
struct XYS_Z {
struct XYS xys;
int z;
} A1;
a1.xys.x = 71;
a1.z = 12;
Структура того ж самого типу не може міститися в якості поля - рекурсивні визначення заборонені. Зате нерідко використовуються поля - посилання на структури такого ж типу (або іншого). Це дозволяє організовувати списки структур:
struct node {
int value;
struct node * next;
};
Дуже часто використовуються масиви структур:
struct XYS array [20];
int i = 5, j;
array [i] .x = 12;
j = array [i] .x;
Зовнішні та статичні структури можна ініціалізувати, поміщаючи слідом за визначенням список початкових значень елементів:
struct anketa a0 = {1024230089, "Петрів В.М", "10.01.1973", 0, "Львів, Виговського, 23/99", 1750.00};
Кожній структурній змінній в нашому випадку можуть бути присвоєні шість значень, що мають відповідні базові типи.
Структури однакового типу можна присвоювати повністю (що відповідає присвоюванню кожного з полів):
struct XYS s1, s2; ...
s2 = s1;
Доступ до значень здійснюється за допомогою наступної конструкції:
Ім.я_структури.ім’я_елемента
Або
покажчик _на_структуру -> ім'я_поля
Наприклад, ми можемо з урахуванням введених позначень написати:
a0.data = "10.01.43"; a1.summa = 0.0;
if (a2.pol == 1) man = man + 1;
Приклад звертання до полів структури
struct _Point {
short x, y; /* координати точки */
char *s; /* мітка точки */
} Point;
Point p; Point *pptr; short *iptr;
struct _Curve {
Point points[25]; /* вершини ламаної */
int color; /* колір лінії */
} aLine[10], *linePtr = & aLine[0];
...
pptr = &p; /* покажчик на структуру p */
p.x = 1;
p.y = 2;
p.s = "Grue";
linePtr->points[2].x = 54;
aLine[5].points[0].y = 17;
Дата добавления: 2015-07-24; просмотров: 615;