Оголошення масиву
Незважаючи на те, що синтаксис оголошення масиву є різним для різних мов програмування, для коректного опису масиву у будь-якому випадку необхідно задати:
базовий тип елементів,
розмірність масиву;
його розмір (для багатовимірних масивів – по кожній розмірності);
"спосіб" нумерування елементів (не у всіх мовах програмування).
Так РБНФ-нотація оголошення масиву у мові Pascal має вигляд:
оголошення_масиву = array “[“ тип_індекса {, тип_індекса} “]” of базовий_тип,
де тип_індекса є певним допустимим порядковим типом. Характерною особливістю типу індекса у Pascal є те, що він опосередковано задає кількість елементів певної розмірності масиву (як кількість можливих значень цього типу) і "спосіб" їх нумерування (як відповідне значення типу індекса, а не порядковий номер елемента в масиві). Такий спосіб задання типу індекса дає змогу наочно і зрозуміло інтерпретувати окремі елементи масиву. Наприклад,
Type
day = (mon, tues, wen, th, fri, sat, sun) ;
Var
workday : array [1 .. 5] of day ; { робочі дні тижня окремого працівника }
k_ill : array [day] of byte ; { кількість захворілих протягом тижня }
kol: array [1950 .. 1996] of longint; { кількість населення у визначені роки }
m : array [1 .. 20, 1..10] of real ;
У загальному випадку індекси багатовимірних масивів не обов'язково повинні мати однаковий тип. Наприклад, структураPascal, що містить інформацію про чисельність населення окремої соціальної групи в декількох містах за певний період часу:
Type
town = ( Moscow, Kiev, Minsk );
group = ( worker, office_worker, peasant );
Var
kol: array (town, group, 1960..2011) of longint.
Тут має місце тривимірний масив, причому кожна з його розмірностей визначається своїм типом.
РБНФ-нотація оголошення масиву у С/С++ має наступний вид:
оголошення_масиву = базовий_тип ім'я”[“розмір”]” { ”[ “розмір”]”}
розмір = цілочисельна_константа | константна_змінна.
Особливістю оголошення масиву у С/С++ є стандартна індексація його елементів: перший елемент завжди має індекс 0. Наприклад,
int a[3]; // a[0], a[1], a[2], a[3]
int d[2][3]; // d[0][0] d[0][1] d[0][2] d[1][0] d[1][1] d[1][2]
Введення такого обмеження має свою логіку, оскільки тут широко використовується адресна арифметика.
Для задання розмірностей масиву у С/С++ широко використовуються константні змінні. Константна змінна – це змінна, яка ініціалізується початковим значенням при оголошенні і не може змінювати це своє значення у процесі виконання програми. Оголошуються такі змінні з використанням специфікатора типу даних const. Наприклад,
const int n = 5, m = 7;
double b[n][m]; // масив розміру 5х7
Слід зазначити, що у С/С++ при оголошенні масиву не тільки виділяється пам'ять для його елементів, але й формується покажчик, який співпадає з ім'ям масиву і значення якого дорівнює адресі першого (нульового) елемента масиву. Тобто, ім’я масиву є і постійним вказівником(адресною константою) на цей масив (на його перший елемент). З точки зору синтаксису мови С/С++ цей покажчик є константою, значення якої можна використовувати у виразах, але змінити це значення не можна.
Як і змінні, масиви можуть визначатися. РБНФ-нотація визначення масиву у С/С++:
визначення_масиву = базовий_тип ім'я”[“розмір”]” { ”[ “розмір”]”} ”= {”список_значень”}”
Наприклад,
char c[3] = {'a', 'k', 'c'};
float b[5] = {5.7, 0.4, 3.9, 2.7, 1.8};
int d[2][3] = {{3, 5, 7}, {4, 3, 1}}.
Особливостівизначення:
кількість елементів масиву при оголошенні може бути опущена (визначається кількістю елементів в списку початкових значень), наприклад,
char a[ ] = {'a', 'b', 'c'};
int m[ ][2] = {3, 5, 7, 1};
якщо початкових значень менше, ніж елементів в масиві, всі інші елементи автоматично ініціалізуються 0, наприклад,
int d[10] = {5, 8, 19, 34}; 5, 8, 19 , 34 , 0 , 0 , 0 , 0 , 0 , 0
int m[3][2] = {3, 5, 7} 3 5
7 0
0 0
int m[2][3] = {{3}, {5, 7}}; 3 0 0
5 7 0
для недопущення подальшої зміни значень елементів масиву треба визначити його з ключовим словом const, наприклад,
const int m[ ] = {3, 5, 7, 1};
У мовах програмування, які допускають оголошення програмістом власних типів, як правило, існує можливість створення власного регулярного типу (типу масива). У визначенні такого типу може вказуватися розмір, тип елемента, діапазон значень і типи індексів. Надалі можливе визначення змінних створеного типу. Всі такі змінні-масиви мають одну структуру.
У С/С++ власний регулярний тип (тип масива) можна задати за допомогою директиви typedef:
typedef базовий_тип ім’я_типу[розмір];
typedef базовий_тип ім’я_типу[розмір_1] [розмір_2].
Змінна, що матиме такий тип, оголошується наступним чином:
ім’я_типу ім’я_масиву.
Наприклад,
typedef int Matrix[10][15];
Matrix m;