русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Структури і об’єднання. Оголошення і ініціалізація структур


Дата додавання: 2014-04-22; переглядів: 3470.


Агреговані типи даних, що розглядаються в даному розділі, а саме – структури, об’єднання, поля бітів, а також декларація typedef – дають змогу створювати так звані користувацькі типи даних, імена і наповнення яких задаються розробником програми. Такі типи розширюють можливості вибору форм збереження даних і помітно спрощують процес розробки програм.

Структури – це особливий комбінований тип даних, який об’єднує у спільне ціле набір логічно пов’язаних між собою різнотипних компонентів. Складові частини структури називають полями або елементами. Кожне поле має свій тип і своє ім’я.

З структурами пов’язані два поняття: шаблон структури – визначає конкретну структуру та задає склад і послідовність запису її полів; структурні змінні – дані, сформовані за вказаним шаблоном, для яких в оперативній пам'яті виділено ділянку відповідного розміру.

Шаблон структури оголошується наступною синтаксичною конструкцією:

 

struct тег_структури {

тип_поля_1 ім’я_поля_1;

тип_поля_2 ім’я_поля_2;

тип_поля_3 ім’я_поля_3;

};

 

тут struct – службове (ключове) слово, з якого починається визначення структури; тег структури – ім’я, яке використовується при оголошенні змінних, сформованих за шаблоном цієї структури, має відповідати вимогам до ідентифікаторів. Список полів структури охоплюється фігурними дужками, після правої дужки записується крапка з комою.

Кожне поле структури описується як змінна – типом та іменем. В пам'яті поля структури будуть записані в порядку, заданому в шаблоні структури. Тип поля може бути довільним простим або складеним типом. Ім’я поля є ідентифікатором змінної відповідного типу. В межах одного шаблону імена полів повинні бути різними, але можуть збігатися з іменами полів інших структур або змінних програми.

За змістом шаблон структури – це опис нового типу даних, створеного програмістом. Для шаблону не виділяється місце в оперативній пам'яті, над ними не можна виконувати ніяких операцій. Шаблон слугує основою для оголошення змінних зі створеним структурним типом.

Для прикладу оголосимо структуру, в якій будемо зберігати інформацію про студентів. Структури складається з трьох полів: імені студента, його ідентифікаційного номеру, і рейтингу студента.

 

struct student {

char name[ 40 ];

int number;

double rating;

};

 

Застосовуються дві форми оголошення структурних змінних: через посилання на попередньо оголошений шаблон, одночасно з оголошенням шаблону структури. Перша форма передбачає, що шаблон структури вже оголошений. Тоді його тег спільно зі словом struct можна використовувати для створення змінних відповідного структурного типу. Використовуючи оголошений шаблон структури student можна оголосити відповідні структурні змінні:

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

double rating;

};

struct student с1, с2;

struct student с3[ 10 ];

}

 

В результаті даних оголошень в оперативній пам’яті буде виділено місце для двох змінних с1 і с2 та для масиву с3, що складається з 10 елементів. Обидві змінні та всі елементи масиву будуть мати однаковий розмір і склад полів, встановлений в оголошенні шаблону структури student.

Синтаксис мови С++ дозволяє оголошувати структурні змінні одночасно з оголошенням шаблону структури:

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

double rating;

} s1, s2, s3[ 10 ];

}

 

В оголошеннях структурні змінні можна ініціалізувати, тобто присвоювати їх елементам початкові значення. Список значень, якими ініціалізується структура, записується в фігурних дужках:

 

#include <iostream>

using namespace std;

int main() {

struct student {

char name[ 40 ];

int number;

double rating;

};

struct student s = { "James Bond", 7, 99.99 };

}

 

Значення, якими ініціалізується структура, записують в тій самій послідовності, в якій вказані поля в шаблоні структури, типи констант – ініціалізаторів повинні бути сумісними з типами відповідних полів. Можна виконувати часткову ініціалізацію – задавати тільки значення лише декількох початкових елементів структури.

Для кожної структурної змінної в оперативній пам'яті виділяється неперервна ділянка, обсяг якої дорівнює або більший за сумарний розмір всіх усіх полів даної структури. Реальний обсяг ділянки, яку займає структурна змінна, залежить від прийнятого в даній системі способу вирівнювання даних. Залежно від програмно – апаратних установок вирівнювання може виконуватися на межу слова, подвійного слова, або не виконуватись взагалі. У разі відсутності вирівнювання поля структури записуються підряд, інакше між полями можуть залишатись незайняті байти. Таким чином, розмір структури необхідно визначати за допомогою операції sizeof. Для конструкції sizeof( тип ) дужки обов’язкові, для sizeof тип – ні. Наприклад:

 

#include <iostream>

using namespace std;

int main() {

struct test {

char c;

int i;

double d;

};

struct test t;

cout << "sizeof( test ) " << sizeof( test ) << endl; // 16

cout << "sizeof t " << sizeof t << endl; // 16

cout << "sizeof( char ) " << sizeof( char ) << endl; // 1

cout << "sizeof( int ) " << sizeof( int ) << endl; // 4

cout << "sizeof( double ) " << sizeof( double ) << endl; // 8

}

 

В цьому прикладі розмір структури test складає 16 байтів, розміри char, int i double відповідно 1, 4 і 8 байтів, в сумі – 13 байтів. За рахунок вирівнювання розмір цієї структури перевищує сумарний розмір її складових частин на 3 байта.

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

Поля структур можуть мати довільний тип, як простий, так і складений. Зокрема поле може бути масивом, символьним рядком, або вкладеною структурою. Для вкладених структур діють такі самі правила оголошення, як і для звичайних структур. Наприклад:

 

struct point {

double x, y;

};

struct RGB {

int red, green, blue;

};

struct circle {

struct point center;

struct RGB color;

double radius;

};

 

В цьому прикладі структура circle описує коло. Вкладена структура center типу struct point використовується для збереження інформації про центр кола, вкладена структура color типу struct RGB – для збереження інформації про колір кола, поле radius визначає радіус кола. Ініціалізацію структурної змінної типу struct circle можна виконати так:

 

struct circle c = {

{ 2.1, 3.2 },

{ 255, 255, 255 },

1.2

};

 

В разі повної ініціалізації (як в цьому прикладі) внутрішні фігурні дужки не є обов’язковими, але їх зручно використовувати, щоб виділити ініціалізатори вкладених структур.

З наборів однотипних структур можна формувати масиви. Якщо виконується ініціалізація масиву структур, то початкові значення для кожної із структур записують в окремих фігурних дужках:

 

#include <iostream>

using namespace std;

int main() {

struct point {

double x;

double y;

};

struct point p[ ] = { { 1, 2 }, { 2, 3 }, { 4, 5} };

cout << sizeof( p ) / sizeof( struct point ) << endl;

}

 

В оголошенні не вказано явно розмірність масиву, вона встановлюється компілятором за кількістю проініціалізованих структур. Для знайти кількість елементів такого масиву в програмі ми скористалися виразом з операціями sizeof. Масиви структур зберігають всі властивості структур мови С++. До елементів таких масивів можна звертатись за допомогою індексів або через вказівники.

Оскільки структурні змінні розглядаються як звичайні змінні програми, до них можна застосовувати операцію визначення адреси. Результатом операції буде адреса першого байта ділянки, яку займає в оперативній пам'яті структура – операнд. Значення адреси структури можна присвоїти вказівнику, базовий тип якого збігається з типом структурної змінної. Як і для інших типізованих вказівників, при збільшенні значення вказівника на структуру він буде посилатися на адресу першого байта наступної структури.

 

#include <iostream>

using namespace std;

int main() {

struct point {

double x;

double y;

} p1;

struct point p[ ] = { { 1, 2 }, { 2, 3 }, { 4, 5} };

struct point * t;

t = & p1;

t = p;

t = & p[ 0 ];

}

 


<== попередня лекція | наступна лекція ==>
Динамічне виділення пам’яті | Звертання до елементів структур


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн